我有一个过程,出于某些原因,我必须打电话给以下(请不要判断......)
process = subprocess.Popen("some_command &", shell=True, executable='/bin/bash')
当某些外部条件得到满足时,some_command
应该自行终止。
如何检查some_command
何时终止?
process.poll()
总是返回0
一个简单的脚本来演示我的情况:
import subprocess
process = subprocess.Popen("sleep 5 &", shell=True, executable='/bin/bash')
while True:
print(process.poll())
some_command &
告诉bash
在后台运行some_command
。这意味着你的shell启动some_command
,然后立即退出,切断正在运行的some_command
和你的Python进程之间的联系(some_command
的父进程毕竟不再存在)。 poll()
准确报告bash
本身已经完成运行,退出状态0;它不知道some_command
会发生什么或不发生什么;这是bash
的问题(而bash
也不关心)。
如果你想能够进行轮询以检查some_command
是否仍在运行,请不要通过bash
shell metacharacters对其进行后台处理;没有&
,bash
将继续运行直到它完成,所以你将间接指示some_command
何时完成bash
本身仍在运行的事实。它仍然在后台(在某种意义上它与你的Python代码并行运行; Python进程不会停止等待它或任何东西除非你用wait
明确地用communicate
或process
):
process = subprocess.Popen("some_command", shell=True, executable='/bin/bash')
当然,除非some_command
是一些bash
内置,bash
只是在这里阻碍;如上所述subprocess.Popen
总是在后台运行东西,除非你明确要求wait
,所以你不需要bash
帮助背景任何事情:
process = subprocess.Popen(["some_command"])
会得到类似的行为,实际上让你直接检查来自some_command
的返回码,没有涉及中间的bash
进程。