【问题标题】:Cleaning up temp folder after long-running subprocess exits长时间运行的子进程退出后清理临时文件夹
【发布时间】:2024-01-15 21:59:01
【问题描述】:

我有一个 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 进程不再存在。

【问题讨论】:

  • 您不能只附加rm 命令,以便子shell 串行运行两个命令吗? imageviewer /example/image1.jpg /example/image2.jpg;rm -f /example/*.jpg 注意还要看commands.mkarg()函数处理子命令中的转义空格。

标签: python subprocess temporary-files


【解决方案1】:

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

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

【讨论】:

    最近更新 更多