我有一个出于某些原因的程序,我必须致电以下内容(请不要判断...)
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())
答案 0 :(得分:2)
some_command &
告诉bash
在后台运行some_command
。这意味着您的shell启动some_command
,然后立即退出,从而切断了运行的some_command
与Python进程之间的联系(毕竟some_command
的父进程不再存在)。 poll()
准确地报告了bash
本身已完成运行,并以状态0退出;不知道some_command
会发生什么或不会发生;这是bash
的问题(bash
也不在乎)。
如果您希望能够轮询以检查some_command
是否仍在运行,请不要通过bash
shell元字符将其作为背景;如果没有&
,bash
将继续运行直到完成,因此some_command
本身仍在运行,您将间接指示bash
何时完成。它仍然在后台(从某种意义上说,它与Python代码并行运行;除非您使用{{1}显式wait
或communicate
,否则Python进程将不会等待它或其他任何东西。 }):
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
进程。