2010-05-12 62 views
1

我有一个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") 

..as此块为主线,也不是我可以检查为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) 

这工作,但几乎没有优雅..

基本上,我有一个背景和基础d子进程,并且要在退出时删除临时文件,即使Python进程不再存在。

+2

难道你不能只追加'rm'命令,以便subshel​​l在串行中运行两个命令? imageviewer /example/image1.jpg /example/image2.jpg;rm -f /example/*.jpg 还要注意commands.mkarg()函数来处理子命令中的转义空格。 – 2010-05-12 02:05:05

回答

1

如果您使用的是Unix的任何版本,那么您可以分叉您的Python程序,并让父进程继续其生命周期,而子进程被守护进程运行查看器(如果阻止了孩子进程,无论如何,这个进程在生活中没有其他工作;-),并在之后进行清理。 原来的这个Python进程可能存在也可能不存在,但是这个“等待清理”的子进程当然会(一些进程或者其他已经做好的清理工作,毕竟吧?) 。

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