subprocess.Popen调用的进程在父结束时没有正确关闭

时间:2012-10-01 23:36:13

标签: 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。我想知道为什么会发生这种情况,如果有办法,我可以让它继续执行以下命令。

谢谢!

3 个答案:

答案 0 :(得分:2)

退出进程不会自动导致其所有子进程被终止。有关此问题的详细讨论,请参阅this question及其相关问题。

gzip退出,因为包含其标准输入的管道在父项退出时关闭;它读取EOF并退出。但是,运行这两个命令的shell不是从stdin读取的,所以它没有注意到这一点。所以它继续执行echo命令(也不读取标准输入)。

答案 1 :(得分:0)

post_proc.kill()我相信你正在寻找......但是你必须明确地称之为

请参阅:http://docs.python.org/library/subprocess.html#subprocess.Popen.kill

答案 2 :(得分:0)

在这种情况下,我会使用try-finally(很遗憾,您无法像在with中那样使用file.open()

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