Python Popen().stdout.read()挂起

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中复制它 另一个脚本只打印几个单词,我假设这不是缓冲区问题 有人

我正在尝试使用Python的
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/stderr的挂起读数:


如果您在
命令中手动运行该命令,它将生成输出?谢谢您的回答。我刚刚意识到我已经读了那部分文件。。我所做的是在脚本运行时在
进程中实时获取stdout。poll()为None:
循环,上面的代码是精简版本。但我猜它挂起是因为类似的死锁问题…嗯,这对我不起作用,它仍然挂起