如何解决用subprocess.PIPE增量输出
| 我正在使用subprocess
模块从另一个应用程序运行命令,我知道您可以执行以下操作
import subprocess
app = subprocess(args,stdout=subprocess.PIPE)
out,err = app.communicate()
print out
我希望将输出显示为发生在最后一个大斑点上。有想法吗?
解决方法
问题可能是您在子进程中运行的命令缓冲了其输出:在这种情况下,按照Blender的回答,直到子进程的输出缓冲区填满并导致刷新后,,2ѭ才会返回因此被父进程看到。
有关缓冲如何影响事物的更多信息,请参见此答案和该答案。
以下是一些脚本来说明:
# spew.py
import sys
import time
for i in range(10):
print \'Message no. %d\' % i
#sys.stdout.flush()
time.sleep(1)
和
# runspew.py
import subprocess
import time
start = time.time()
p = subprocess.Popen([\'python\',\'spew.py\'],stdout=subprocess.PIPE)
data = p.stdout.read(1)
print \'Elapsed time to first byte read: %.2f\' % (time.time() - start)
data = p.stdout.read()
print \'Elapsed time to last byte read: %.2f\' % (time.time() - start)
p.wait()
现在,将两个脚本放在同一目录中并运行python runspew.py
。您会看到以下内容:
Elapsed time to first byte read: 10.05
Elapsed time to last byte read: 10.05
现在,从spew.py
中的sys.stdout.flush()
中删除注释,然后再次执行python runspew.py
。您现在会看到类似以下内容:
Elapsed time to first byte read: 0.02
Elapsed time to last byte read: 10.04
请注意,ѭ11并没有改变:只有像子进程一样运行的程序才改变。如果无法使正在运行的程序无缓冲运行(或频繁刷新),则必须使用use12ѭ/unbuffer
,如我链接到的其他答案所述。
, 我曾经做过一个Python Shell实现,所以这是我用来运行命令的代码。它可以分别运行wget
和nano
,所以我认为代码将满足您的需求:
process = subprocess.Popen(shlex.split(command),stdout = subprocess.PIPE,stderr = subprocess.STDOUT)
while True:
output = process.stdout.read(1)
if output == \'\' and process.poll() != None:
break
if output != \'\':
sys.stdout.write(output)
sys.stdout.flush()
基本上,您必须直接写入stdout
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。