Python 从stdout读取Popen需要很长时间

Python 从stdout读取Popen需要很长时间,python,popen,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())

我试图从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',它会像预期的那样结束,所以我不知道为什么上面的操作没有结束

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?!")
一些可能有用的额外信息

  • npm通过nvm安装
  • 这用于通过符号链接管理节点安装
  • 我看到的npm是一个执行node的.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()需要很长时间才能完成

在popen.wait()中使用stdout=PIPE和/或stderr=PIPE将导致死锁。尝试使用communicate()来避免这种情况。 这是由于其他操作系统管道缓冲区填满并阻塞了子进程。 有关如何使用communicate()的信息,请参阅本文档


希望我能帮忙

请在命令提示符下手动键入时共享控制台输出

您共享的代码在我的机器上运行,我认为它可能与npm的安装方式有关。在任何情况下,您都可以共享命令控制台的输出

谢谢
Pushpa

尝试为Popen()添加shell=True。据我所知,npm是windows中的bat文件。它已经有了(向右滚动),不放置它会导致文件未找到错误。您是否也可以使用:Add close_fds=True来调用subprocess。Popen()close_fds对此问题没有影响。npm是通过nvm安装的,我还怀疑这可能是我的问题的原因常规安装的npm(通过节点安装程序)按预期工作