![](/img/trans.png)
[英]Killing shell=True process results in ResourceWarning: subprocess is still running
[英]Check if subprocess called with shell=True is still running
我有一个出于某些原因的程序,我必须致电以下内容(请不要判断...)
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
。 这意味着您的外壳程序启动some_command
,然后立即退出,从而切断正在运行的some_command
和您的Python进程之间的some_command
( some_command
的父进程毕竟不再存在)。 poll()
准确地报告bash
本身已完成运行,并以状态0退出; 它不知道some_command
会发生或不会发生some_command
; 那是bash
的问题( bash
也不在乎)。
如果您希望能够轮询以检查some_command
是否仍在运行,请不要通过bash
shell元字符将其作为背景; 不带&
, bash
会继续运行直到完成为止,因此您将间接地指示some_command
完成,因为bash
本身仍在运行。 它仍然在后台(从某种意义上说,它与Python代码并行运行;除非您明确地wait
process
或与process
communicate
,否则Python进程不会等待它或其他任何东西):
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
进程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.