2010-05-12 60 views
1

我有一個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) 

這工作,但幾乎沒有優雅..

基本上,我有一個背景和基礎d子進程,並且要在退出時刪除臨時文件,即使Python進程不再存在。

+2

難道你不能只追加'rm'命令,以便subshel​​l在串行中運行兩個命令? imageviewer /example/image1.jpg /example/image2.jpg;rm -f /example/*.jpg 還要注意commands.mkarg()函數來處理子命令中的轉義空格。 – 2010-05-12 02:05:05

回答

1

如果您使用的是Unix的任何版本,那麼您可以分叉您的Python程序,並讓父進程繼續其生命週期,而子進程被守護進程運行查看器(如果阻止了孩子進程,無論如何,這個進程在生活中沒有其他工作;-),並在之後進行清理。 原來的這個Python進程可能存在也可能不存在,但是這個「等待清理」的子進程當然會(一些進程或者其他已經做好的清理工作,畢竟吧?) 。

如果你在Windows上,或者需要跨平臺的代碼,那麼讓你的Python程序「產卵」(即,只是從子進程開始,然後繼續生活)另一個(小得多),這是一個負責運行觀察者(阻塞,誰在乎),然後進行清理。 (如果在Unix上,即使在這種情況下,您可能也想要守護進程,否則當父進程執行時子進程可能會消失)。