有很多类似的帖子,但我没有找到答案。
在Gnu / Linux上,使用Python
和subprocess
模块,我使用以下代码迭代
使用子进程启动的命令的stdout / sdterr:
class Shell:
"""
run a command and iterate over the stdout/stderr lines
"""
def __init__(self):
pass
def __call__(self,args,cwd='./'):
p = subprocess.Popen(args,
cwd=cwd,
stdout = subprocess.PIPE,
stderr = subprocess.STDOUT,
)
while True:
line = p.stdout.readline()
self.code = p.poll()
if line == '':
if self.code != None:
break
else:
continue
yield line
#example of use
args = ["./foo"]
shell = Shell()
for line in shell(args):
#do something with line
print line,
这很好......除非执行的命令是python
,例如`args = ['python','foo.py'],在这种情况下输出不会被刷新,而是只在命令完成。
有解决方案吗?
答案 0 :(得分:2)
查看How to flush output of Python print?。
您需要使用-u选项运行python子进程:
-u强制stdin,stdout和stderr完全无缓冲。在系统上 tems在哪里重要,也把stdin,stdout和stderr放在二进制文件中 模式。请注意,xreadlines()中有内部缓冲, readlines()和文件对象迭代器(“用于sys.stdin中的行”) 这不受此选项的影响。为了解决这个问题,你 将要在“while 1:”循环中使用“sys.stdin.readline()”。
或者,如果您可以控制python子流程脚本,则可以使用sys.stdout.flush()在每次打印时刷新输出。
import sys
sys.stdout.flush()