我使用Python的subprocess.communicate()
从一个运行了大约一分钟的进程中读取标准输出。
我如何以流的方式打印出该进程的stdout
的每一行,这样我就可以看到生成的输出,但在继续之前仍然阻止进程终止?
subprocess.communicate()
似乎一次给出了所有输出。
发布于 2013-04-25 12:39:51
我认为以流式方式从进程中收集输出的最简单方法如下:
import sys
from subprocess import *
proc = Popen('ls', shell=True, stdout=PIPE)
while True:
data = proc.stdout.readline() # Alternatively proc.stdout.read(1024)
if len(data) == 0:
break
sys.stdout.write(data) # sys.stdout.buffer.write(data) on Python 3.x
在进程终止后,readline()
或read()
函数应该只在EOF上返回一个空字符串-否则,如果没有要读取的内容,它将阻塞(readline()
包含换行符,因此在空行上,它将返回"\n")。这样就不需要在循环之后进行笨拙的最终communicate()
调用。
对于具有非常长的行的文件,read()
可能更适合于减少最大内存使用量-传递给它的数量是任意的,但排除它会导致一次读取整个管道输出,这可能是不可取的。
发布于 2010-04-27 02:29:31
如果您想使用非阻塞方法,请不要使用process.communicate()
。如果将subprocess.Popen()
参数stdout
设置为PIPE
,则可以从process.stdout
读取并检查进程是否仍在使用process.poll()
运行。
发布于 2017-11-13 07:22:11
myCommand="ls -l"
cmd=myCommand.split()
# "universal newline support" This will cause to interpret \n, \r\n and \r equally, each as a newline.
p = subprocess.Popen(cmd, stderr=subprocess.PIPE, universal_newlines=True)
while True:
print(p.stderr.readline().rstrip('\r\n'))
https://stackoverflow.com/questions/2715847
复制相似问题