Python 父进程结束时,subprocess.Popen调用的进程未正确关闭
我用Python编写了以下简化代码:Python 父进程结束时,subprocess.Popen调用的进程未正确关闭,python,parent-child,popen,Python,Parent Child,Popen,我用Python编写了以下简化代码: proc_args = "gzip --force file; echo this_still_prints > out" post_proc = subprocess.Popen(proc_args, shell=True) while True: time.sleep(1) 假设文件足够大,需要几秒钟才能完成此过程。如果在gzip仍在运行时关闭Python进程,它将导致gzip结束,但它仍将执行以下gzip行。我想知道为什么会发生这种情
proc_args = "gzip --force file; echo this_still_prints > out"
post_proc = subprocess.Popen(proc_args, shell=True)
while True:
time.sleep(1)
假设文件足够大,需要几秒钟才能完成此过程。如果在gzip仍在运行时关闭Python进程,它将导致gzip结束,但它仍将执行以下gzip行。我想知道为什么会发生这种情况,以及是否有办法使其不继续执行以下命令
谢谢大家! post\u proc.kill()
我相信这就是你要找的。。。但是,好吧,你必须明确地称之为
请参阅:进程退出不会自动导致其所有子进程被终止。有关这方面的详细讨论,请参阅及其相关问题
gzip退出是因为包含其标准输入的管道在父管道退出时关闭;它读取EOF并退出。但是,运行这两个命令的shell没有从stdin读取数据,因此它没有注意到这一点。因此,它只是继续执行
echo
命令(该命令也不读取stdin)。在这种情况下,我使用try finally
(不幸的是,您不能像在file.open()
中那样使用和
:
我的程序有一个信号处理程序,所以当我收到关闭信号时,这肯定有助于防止这个问题。问题是如果程序崩溃,我负担不起这样做。它不应该崩溃是显而易见的答案:P。。。事实上,你必须清楚地处理这个问题。。。我不认为有一种方法可以绕过它。。。也许把你的整个程序放在一个Try/Except/Finally中,然后关闭Finally中的所有进程。。。这样,它几乎可以保证关闭…你是对的,这将是最佳的解决方案,但机器可能会崩溃,可能会出现电力短缺和其他灾难性事件。我很担心,因为我将处理关键数据,所以我需要为此类事件做好准备。但您的解决方案肯定会大大降低风险,非常感谢!嗯,事实上机器崩溃不会是一个问题,因为它不会运行下一个命令哈哈,我的错。我认为如果你用try/except/finally来包装整个过程,并在finally中杀死它们,它应该在所有合理的情况下都能工作……你是对的Barmar。非常感谢您的澄清。现在我明白发生了什么,我想现在我必须拆分命令,这样就不会再发生这种情况,并添加一些代码来管理它。这个信息非常有用,谢谢!
proc_args = "gzip --force file; echo this_still_prints > out"
post_proc = subprocess.Popen(proc_args, shell=True)
try:
while True:
time.sleep(1)
finally:
post_proc.kill()