[英]Python subprocess on Windows 7 64bit - no output when stdout=PIPE
[英]python subprocess output disappear when redirect stdout to pipe
我目前正在处理一段代码,该代码使用一个脚本来获取实时数据并将其打印到我的屏幕上。
当我在python控制台中运行脚本(我无法访问视图)时,使用:
>>>> myproc = subprocess.Popen('command')
...print....
当数据到来时,输出完美地打印在我的屏幕上。
但是,如果我将其更改为
>>>> myproc = subprocess.Popen('command', stdout = subprocess.PIPE, stderr = subprocess.PIPE)`
>>>> while True:
>>>> print(myproc.stdout.readline())
... perfectly no print....
有零输出(我也检查过stderr,什么都没有)
我想这里的问题是我将stdout
设置为subprocess.PIPE
,我应该改变它。
但是,因为我需要存储来自myproc
的数据,并且使用stdout
是迄今为止我所知道的唯一允许我这样做的方法,所以我对如何更改代码的想法已经不多了。
请告诉我我能在这做什么,还请告诉我为什么会这样。
谢谢
编辑:我的脚本侦听实时数据,因此它将继续运行,直到我手动中断它。 我想在它实际终止之前打印。
第二次编辑 :
我发现丢失的输出去了...我必须改变它
myproc = subprocess.Popen('command', stdout=sys.stdout)
然后使用
While True:
if myproc.stdout is not None:
print(myproc.stdout)
输出显示。 但这只是超级丑陋而且输出可能非常难以预测..任何人都可以提供更好的方法来处理这个丑陋的事情吗?
您应该使用通信来等待进程完成并获取stdout和stderr处理程序:
myproc = subprocess.Popen(['command'], stdout = subprocess.PIPE, stderr = subprocess.PIPE)
out, err = myproc.communicate()
print("STDOUT:")
for line in myproc.stdout:
print(line)
print("STDERR:")
for line in myproc.stderr:
print(line)
另一种可能性是它打印到stderr而不是stdout。
最后,如果你Popen
命令的单个字符串参数调用Popen
,你还应该设置shell=True
来生成一个shell,否则你应该使用一个列表。 虽然如果你没有任何参数,它可以在不使用列表的情况下工作。
那么您可能会对以下代码段感兴趣:
p = subprocess.Popen([command], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out = io.TextIOWrapper(p.stdout)
err = io.TextIOWrapper(p.stderr)
while p.poll() == None:
ret = select.select([out.fileno(), err.fileno()], [], [])
for fd in ret[0]:
if fd == out.fileno():
output_parser(out.readline())
if fd == err.fileno():
output_parser(err.readline())
for line in out.read().split('\n'):
output_parser(line)
for line in err.read().split('\n'):
output_parser(line)
取自我最近写的代码:
https://github.com/guyzmo/pyvod/blob/master/vod/video.py#L70
HTH
如果这是linux或osx,问题是您需要使用伪终端使程序认为它应该以交互方式运行。 python pexpect模块用于处理这个问题。 它创建了一个pty并将其用于stdout。 您可以直接使用pexpect或阅读其来源,了解烹饪自己的东西。 此示例将命令输出发送到屏幕和磁盘上的文件。
import pexpect
proc = pexpect.spawn('command', logfile=open('mylog.txt','w'),
searchwindowsize=80, timeout=-1)
for line in proc:
print(line.strip())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.