代码之家  ›  专栏  ›  技术社区  ›  dbr

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

  •  1
  • dbr  · 技术社区  · 14 年前

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

    1 回复  |  直到 12 年前
        1
  •  1
  •   Alex Martelli    14 年前

    如果您使用的是Unix的任何变体,您可以派生Python程序,并在子进程被守护的同时让父进程继续它的生命,运行查看器(如果它阻止了子进程,那么子进程在生命中没有其他任务;-)并在它之后进行清理。这个 起初的 Python进程可能存在,也可能不存在,但是“等待清理”子进程当然会存在( 过程还是其他的都要做清理,对吧?-).

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