从stdout读取Popen永远不会结束

问题描述 投票:0回答:2

我正在尝试从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',它会按预期结束,所以我不知道为什么上面的操作没有结束。

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

  • 通过nvm安装npm
  • 这用于通过符号链接管理节点安装
  • 从我看到的npm中可以看到一个执行节点的.cmd文件?
python popen
2个回答
0
投票

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

希望我能帮上忙!


0
投票

读取Popen的输出要求您使用communicate方法。另外,npm --version仅在shell=True位于单个字符串而非字符串列表中时才对我有用:

import subprocess

proc = subprocess.Popen('npm --version', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

try:
    stdout, stderr = proc.communicate(timeout=2)
except subprocess.TimeoutExpired:
    proc.kill()
    stdout, stderr = proc.communicate()

print(stdout.decode('utf-8').strip())

print("DOES get here!!!!")

我的上述输出:

>>> import subprocess
>>>
>>> proc = subprocess.Popen('npm --version', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
>>>
>>> try:
...     stdout, stderr = proc.communicate(timeout=2)
... except subprocess.TimeoutExpired:
...     proc.kill()
...     stdout, stderr = proc.communicate()
...
>>> print(stdout.decode('utf-8').strip())
3.5.2
>>>
>>> print("DOES get here!!!!")
DOES get here!!!!
>>>
© www.soinside.com 2019 - 2024. All rights reserved.