Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 父进程结束时,subprocess.Popen调用的进程未正确关闭_Python_Parent Child_Popen - Fatal编程技术网

Python 父进程结束时,subprocess.Popen调用的进程未正确关闭

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行。我想知道为什么会发生这种情

我用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行。我想知道为什么会发生这种情况,以及是否有办法使其不继续执行以下命令

谢谢大家!

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()