在按下 Enter 之前,带有 PIPE stdout 的 Popen 不存在

Popen with PIPE stdout doesn't exit untill Enter is pressed

当我使用 PIPE stdout 启动 Popen 时,进程不会退出,直到我按下 Enter(Windows OS,使用多个 pythonlxc 版本) 例如:

import subprocess as sp

cmd = ['lxc', 'exec', 'remote:container', '--', 'echo', '1']

with sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) as proc:
    while True:
        print(proc.poll())

打印 None None None... (proc.poll() == None 当进程还在 运行ning ) 当我按下 Enter 它立即退出。

这个过程本身就完成了它的工作,没有错,只是这个现有的问题。它可能在我调用的实用程序的范围内 (lxc),但是我可以做些什么来调试它或从 python 代码中绕过它吗?

此调用在 py.test 运行 期间调用时有效,当 py.test 捕获所有输出时,也许我可以做类似的事情?

如果您不希望您的进程与 stdin 交互(适用于等待或响应该句柄上的输入的类别),防止这种情况的最佳方法是不要让它继承您的原始 Python 脚本的句柄(默认情况下没有 stdin 参数传递给 Popen)。

几种方法:

  • 添加参数 stdin=subprocess.DEVNULL(在 Python 的新版本上)
  • 添加参数stdin=open('/dev/null')
  • 添加参数stdin=subprocess.PIPE,然后调用proc.stdin.close(),或者proc.communicate('')(当然,前提是你只想要communicate()的其他效果)。