myu*_*uf3 1 python subprocess stdout
我正在使用subprocess
模块运行来自其他应用程序的命令我知道您可以执行以下操作
import subprocess
app = subprocess(args, stdout=subprocess.PIPE)
out, err = app.communicate()
print out
Run Code Online (Sandbox Code Playgroud)
我希望输出显示为最终发生的一个大blob.想法?
问题可能是您在子进程中运行的命令缓冲其输出:在这种情况下,在Blender的答案中,process.stdout.read(1)
在子进程的输出缓冲区填满之前不会返回,导致它被刷新,因此可以看到父进程.
这里有一些脚本来说明:
# spew.py
import sys
import time
for i in range(10):
print 'Message no. %d' % i
#sys.stdout.flush()
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
和
# 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()
Run Code Online (Sandbox Code Playgroud)
现在,将两个脚本放在同一目录中并运行python runspew.py
.你会看到这样的事情:
Elapsed time to first byte read: 10.05
Elapsed time to last byte read: 10.05
Run Code Online (Sandbox Code Playgroud)
现在,从删除评论sys.stdout.flush()
中spew.py
,做python runspew.py
一次.你现在会看到这样的东西:
Elapsed time to first byte read: 0.02
Elapsed time to last byte read: 10.04
Run Code Online (Sandbox Code Playgroud)
请注意,runspew.py
没有更改:只有作为子进程运行的程序才会更改.如果您正在运行的程序无法运行无缓冲(或频繁刷新),那么您将必须使用expect
/ unbuffer
,如我链接的其他答案中所述.
归档时间: |
|
查看次数: |
2079 次 |
最近记录: |