从标准输出读取Popen会花费很长时间

时间:2019-11-21 10:45:32

标签: python popen

我正在尝试从shell命令(npm --version)捕获输出,但是仅读取第一行,并且该过程没有结束。

import subprocess
proc = subprocess.Popen(['npm', '--version'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
proc.wait()
for line in proc.stdout:
    print(line.decode("utf-8").strip())
print("does not get here?!")

有什么办法可以检测到此过程的结束吗?。

如果我打开一个cmd并执行'npm --version',它会按预期结束,所以我不知道为什么上面的操作没有结束。

一些可能有用的额外信息!...

  • npm是通过nvm安装的
  • 这用于通过符号链接管理节点安装
  • 从我看到的
  • npm是执行节点的.cmd文件?

在python命令提示符下运行它...

>>> import subprocess
>>> proc = subprocess.Popen(['npm', '--version'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
>>> proc.wait()
0
>>> proc.stdout.readline()
'6.10.3\n'
>>> proc.stdout.readline()
''

现在第二个.readline()需要非常长的时间才能完成!

2 个答案:

答案 0 :(得分:0)

在popen.wait()中使用stdout = PIPE和/或stderr = PIPE将导致死锁。尝试使用communication()避免这种情况。 这是由于其他OS管道缓冲区填满并阻塞了子进程。 请参阅此文档,了解如何使用通讯() https://docs.python.org/2/library/subprocess.html

希望我能帮上忙!

答案 1 :(得分:0)

当您在命令提示符下手动键入命令时,是否可以共享控制台输出?

您共享的代码可以在我的机器上工作,我假设它可能必须与npm的安装方式有关。无论如何,您都可以共享命令控制台的输出。

谢谢 普什帕

相关问题