【发布时间】:2021-03-03 18:23:53
【问题描述】:
我有一个使用subprocess.Popen 生成进程的代码:
from subprocess import check_call, CalledProcessError, Popen, PIPE
cmd="while true; do echo 123; done | grep -m1 123"
proc = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE)
out, err = proc.communicate()
当我使用 Python 3.9.2 运行它时,它会按预期立即终止。但是,当我使用 Python 2.7 运行它时,它会挂起。似乎 Python 2.7 等待 shell 无限循环终止,但它永远不会终止。我也可以让这段代码在 Python 2.7 下终止吗?
【问题讨论】:
-
它应该返回对我来说并不是很明显。 Popen 启动了一个 shell 进程。即使
grep已关闭stdout句柄,该进程仍在运行。 -
当
grep终止时,它也应该终止while true循环。这可以在 bash 交互式 shell 中观察到。如我所见,这就是 Python 3.9.2 中发生的情况,但在 Python 2.7 中不会发生。
标签: python python-3.x python-2.7