订单是否对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时允许灵活性。 (披露:我是维护者,我写这部分是为了回应你遇到的困难。)