我有一个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 进程不再存在。
最佳答案
如果你使用的是 Unix 的任何变体,你可以 fork 你的 Python 程序,让父进程继续其生命,而子进程守护进程运行查看器(如果阻塞的话,那根本不重要)子进程,无论如何它在生命中没有其他工作;-),并在它之后进行清理。 原始 Python进程此时可能存在,也可能不存在,但是“等待清理”子进程当然会存在(某些进程或其他进程必须执行清理工作) -up,毕竟,对吧?-)。
如果你使用的是 Windows,或者需要跨平台代码,那么让你的 Python 程序“生成”(即,从子进程开始,然后继续生活)另一个(小得多的)程序,这就是那个程序任务是运行查看器(阻塞,谁在乎),然后进行清理。 (如果在 Unix 上,即使在这种情况下,您也可能需要守护进程,否则子进程可能会在父进程消失时消失)。
关于python - 长时间运行的子进程退出后清理临时文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2815665/