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

标签 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 进程不再存在。

最佳答案

如果你使用的是 Unix 的任何变体,你可以 fork 你的 Python 程序,让父进程继续其生命,而子进程守护进程运行查看器(如果阻塞的话,那根本不重要)子进程,无论如何它在生命中没有其他工作;-),并在它之后进行清理。 原始 Python进程此时可能存在,也可能不存在,但是“等待清理”子进程当然会存在(某些进程或其他进程必须执行清理工作) -up,毕竟,对吧?-)。

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

关于python - 长时间运行的子进程退出后清理临时文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2815665/

相关文章:

python - OpenAi 未返回结果并退出,代码=0

python - 如何获取 Scipy 稀疏矩阵(csr_matrix 和 csc_matrix)中每一行的总和和每一列的总和?

python - 我不能在 EMAIL_PASSWORD 中使用 Unicode 字符和 django

windows - 使用VLC的虚拟界面时如何防止显示控制台

c++ - 作为 QT 小部件的子进程

javascript - NodeJs 使用 tmp 或其他东西创建、服务和删除临时文件

python - 在 linux 中使用 python 创建进程树,如 pstree 命令

linux - 如何在 linux 上创建无论如何都会自动清理的临时文件?

python - 如何使用 tempfile.NamedTemporaryFile()?

python - 如何在进程终止时清理 subprocess.Popen 实例