subprocess.PIPE的增量输出

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.想法?

Vin*_*jip 5

问题可能是您在子进程中运行的命令缓冲其输出:在这种情况下,在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,如我链接的其他答案中所述.