Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python subprocess.Popen()-顺序对p.stdout.read()和p.wait()重要吗?_Python_Subprocess - Fatal编程技术网

Python subprocess.Popen()-顺序对p.stdout.read()和p.wait()重要吗?

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

关于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 = 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,你能根据我的假设澄清一下吗?在这种情况下,这不重要——两个呼叫的阻塞时间都不应该比另一个长。