订单是否对p.stdout.read()和p.wait()有影响?

关于Python的subprocess.Popen()对象的问题
(请假定stdout / stderr生成的字节数不会填满操作系统管道缓冲区并创建死锁,等待OS管道缓冲区接受更多数据)

1)p.stdout.read()和p.wait()的顺序有什么关系?

2)在stdout / stderr subprocess.PIPE块上执行read(),直到进程终止?

3)即使在进程终止后,stdout / stderr子进程.PIPE文件对象和数据是否可用?

import subprocess
process = subprocess.Popen(args="ls", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
stdout = process.stdout.read()
# Does the above read() block until the process has terminated?
stderr = process.stderr.read()
return_code = process.wait()

process = subprocess.Popen(args="ls", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
return_code = process.wait() 
# Are stdout and stderr pipes available now, even after the process terminated?
stdout = process.stdout.read()
stderr = process.stderr.read()

问:p.stdout.read()和p.wait()所处的顺序有什么关系?
答:不可以。

问:在stdout / stderr subprocess.PIPE块上执行read(),直到进程终止?
答:如果未指定要读取的字节数限制,则它将阻塞,直到流关闭(这可能在进程终止时)。

问:即使在进程终止后,stdout / stderr子进程.PIPE文件对象和数据是否可用?
答:是的。

您可能需要特别关注subprocess文档中的警告:

警告:当使用stdout=PIPE和/或stderr=PIPE时,这会发生死锁,并且子进程向管道生成足够的输出,从而阻止等待OS管道缓冲区接受更多数据。 使用communicate()来避免这种情况。


您可能需要考虑使用像sarge这样的库,在使用子进程执行I / O时允许灵活性。 (披露:我是维护者,我写这部分是为了回应你遇到的困难。)

链接地址: http://www.djcxy.com/p/77109.html

上一篇: does order matter for p.stdout.read() and p.wait()?

下一篇: Python subprocess losing 10% of a program's stdout