我有一个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)这是可行的,但很难说得上优雅。
基本上,我有一个背景子进程,并希望在它退出时删除临时文件,即使Python进程不再存在。
发布于 2010-05-12 10:11:10
如果您使用的是Unix的任何变体,您可以派生Python程序,让父进程继续它的生命,同时子进程守护进程,运行查看器(如果这会阻止子进程,这至少没有关系,因为子进程在生活中没有其他工作;-),并在它之后进行清理。原始的Python进程可能存在,也可能不存在,但“等待清理”子进程当然会存在(毕竟,某个进程或其他进程必须进行清理,对吧?-)。
如果你在Windows上,或者需要跨平台代码,那么让你的Python程序“衍生”(即从子进程开始,然后继续运行)另一个(小得多的)程序,它的任务是运行查看器(阻塞,谁关心),然后进行清理。(如果在Unix上,即使在这种情况下,您也可能希望执行守护进程,否则子进程可能会在父进程执行守护进程时消失)。
https://stackoverflow.com/questions/2815665
复制相似问题