长时间运行的子进程退出后清理临时文件夹

时间:2010-05-12 01:45:16

标签: python subprocess temporary-files

我有一个Python脚本(在另一个应用程序中运行),它会生成一堆临时图像。然后我使用subprocess启动应用程序来查看这些内容。

当存在图像查看过程时,我想删除临时图像。

我无法从Python中执行此操作,因为Python进程可能在子进程完成之前退出。我无法做到以下几点:

p = subprocess.Popen(["imgviewer", "/example/image1.jpg", "/example/image1.jpg"])
p.communicate()
os.unlink("/example/image1.jpg")
os.unlink("/example/image2.jpg")

..因为这会阻塞主线程,也无法检查线程中的pid是否已退出

我能想到的唯一解决方案意味着我必须使用shell=True,我宁愿避免:

import pipes
import subprocess

cmd = ['imgviewer']
cmd.append("/example/image2.jpg")

for x in cleanup:
    cmd.extend(["&&", "rm", pipes.quote(x)])

cmdstr = " ".join(cmd)
subprocess.Popen(cmdstr, shell = True)

这很有效,但很不优雅..

基本上,我有一个后台子进程,并希望在退出时删除临时文件,即使Python进程不再存在。

1 个答案:

答案 0 :(得分:1)

如果您使用的是Unix的任何变体,您可以分叉您的Python程序,并让父进程继续其生命,同时子进程守护进程,运行查看器(至少如果阻塞则无关紧要)孩子的过程,无论如何都没有其他工作;-),并在它之后清理。此时原始 Python进程可能存在也可能不存在,但“等待清理”子进程当然会(某些进程或其他必须进行清理)毕竟,对吗? - )。

如果你在Windows上,或者需要跨平台代码,那么让你的Python程序“生成”(即,只是从子进程开始,然后继续生活)另一个(小得多)一个,这是一个任务是运行查看器(阻止,谁在乎),然后进行清理。 (如果在Unix上,即使在这种情况下你也可能想要守护进程,否则当父进程执行时子进程可能会消失。)