在按下 Enter 之前,带有 PIPE stdout 的 Popen 不存在
Popen with PIPE stdout doesn't exit untill Enter is pressed
当我使用 PIPE stdout 启动 Popen 时,进程不会退出,直到我按下 Enter
(Windows OS,使用多个 python
和 lxc
版本)
例如:
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()
的其他效果)。
当我使用 PIPE stdout 启动 Popen 时,进程不会退出,直到我按下 Enter
(Windows OS,使用多个 python
和 lxc
版本)
例如:
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()
的其他效果)。