Python subprocess.Popen()-顺序对p.stdout.read()和p.wait()重要吗?
关于Python的subprocess.Popen对象的问题 请假设为stdout/stderr生成的字节数没有填满OS管道缓冲区,并在等待OS管道缓冲区接受更多数据时创建死锁 1 p.stdout.read和p.wait的顺序是否重要? 2是否在进程终止之前读取stdout/stderr subprocess.PIPE块? 3即使在进程终止后,stdout/stderr subprocess.PIPE文件对象和数据是否仍然可用Python subprocess.Popen()-顺序对p.stdout.read()和p.wait()重要吗?,python,subprocess,Python,Subprocess,关于Python的subprocess.Popen对象的问题 请假设为stdout/stderr生成的字节数没有填满OS管道缓冲区,并在等待OS管道缓冲区接受更多数据时创建死锁 1 p.stdout.read和p.wait的顺序是否重要? 2是否在进程终止之前读取stdout/stderr subprocess.PIPE块? 3即使在进程终止后,stdout/stderr subprocess.PIPE文件对象和数据是否仍然可用 import subprocess process = subpr
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的顺序是否重要? A:没有 问:在进程终止之前,是否读取stdout/stderr subprocess.PIPE块? 答:如果没有指定要读取的字节数限制,那么它将阻塞,直到流关闭,这很可能是进程终止时 Q:即使进程终止,stdout/stderr subprocess.PIPE文件对象和数据是否仍然可用? A:是的 您可能需要特别注意子流程文档中的此警告: 警告:当使用stdout=PIPE和/或stderr=PIPE时,这将导致死锁,并且子进程将生成足够的输出到管道,从而阻止等待OS管道缓冲区接受更多数据。使用“沟通”来避免这种情况
问:p.stdout.read和p.wait的顺序是否重要? A:没有 问:在进程终止之前,是否读取stdout/stderr subprocess.PIPE块? 答:如果没有指定要读取的字节数限制,那么它将阻塞,直到流关闭,这很可能是进程终止时 Q:即使进程终止,stdout/stderr subprocess.PIPE文件对象和数据是否仍然可用? A:是的 您可能需要特别注意子流程文档中的此警告: 警告:当使用stdout=PIPE和/或stderr=PIPE时,这将导致死锁,并且子进程将生成足够的输出到管道,从而阻止等待OS管道缓冲区接受更多数据。使用“沟通”来避免这种情况
您可能需要考虑使用一个类库,它允许在用子进程进行I/O时灵活性。披露:我是维护者。我写的部分是为了应对你所遇到的困难。
你可能想考虑使用一个类库,它允许在用子进程进行I/O时灵活性。披露:我是维护者。我写这篇文章的部分原因是为了应对你遇到的困难。
如果你所做的只是阅读输出,我强烈推荐。交流而不是。阅读+。等等。如果你所做的只是阅读输出,我强烈推荐。交流而不是。阅读+。等等。谢谢Amber。我知道死锁警告,但假设一个场景,其中stdout/stderr数据很小,例如,每个都小于1k。我现在编辑了这个问题以反映这一假设。你的2和3个答案很清楚。对于1,你能根据我的假设澄清一下吗?在这种情况下,没关系-两个电话的阻塞时间都不应该比另一个长。谢谢Amber。我知道死锁警告,但假设一个场景,其中stdout/stderr数据很小,例如,每个都小于1k。我现在编辑了这个问题以反映这一假设。你的2和3个答案很清楚。对于1,你能根据我的假设澄清一下吗?在这种情况下,这不重要——两个呼叫的阻塞时间都不应该比另一个长。