Python Popen().stdout.read()挂起
我正在尝试使用Python的Python Popen().stdout.read()挂起,python,subprocess,stdout,popen,freeze,Python,Subprocess,Stdout,Popen,Freeze,我正在尝试使用Python的subprocess.Popen获取另一个脚本的输出,如下所示 process = Popen(command, stdout=PIPE, shell=True) exitcode = process.wait() output = process.stdout.read() # hangs here 它挂起在第三行,只有当我将其作为python脚本运行时才挂起,并且我无法在python shell中复制它 另一个脚本只打印几个单词,我假设这不是缓冲区问题 有人
subprocess.Popen
获取另一个脚本的输出,如下所示
process = Popen(command, stdout=PIPE, shell=True)
exitcode = process.wait()
output = process.stdout.read() # hangs here
它挂起在第三行,只有当我将其作为python脚本运行时才挂起,并且我无法在python shell中复制它
另一个脚本只打印几个单词,我假设这不是缓冲区问题
有人知道我做错了什么吗?您可能想使用而不是。wait()
plus。read()
。注意子流程
文档页面上关于wait()
的警告:
警告:当使用stdout=PIPE
和/或stderr=PIPE
时,这将导致死锁,并且子进程将生成足够的输出到管道,从而阻止等待OS管道缓冲区接受更多数据。使用communicate()
来避免这种情况
read()在返回之前等待EOF
你可以:
- 等待子进程结束,然后read()将返回李>
- 如果输出被分成几行,请使用readline()(如果没有输出行,则仍将挂起)李>
- 使用os.read(F,N),它从F返回最多N个字节,但如果管道为空,它仍将阻塞(除非在fd上设置了O_NONBLOCK)
如果您在
命令中手动运行该命令,它将生成输出?谢谢您的回答。我刚刚意识到我已经读了那部分文件。。我所做的是在脚本运行时在进程中实时获取stdout。poll()为None:
循环,上面的代码是精简版本。但我猜它挂起是因为类似的死锁问题…嗯,这对我不起作用,它仍然挂起