2009-02-24 52 views
3

我需要創建一個我只使用過一次的文件夾,但需要讓它存在,直到下一次運行。看起來我應該使用標準庫中的tmp_file模塊,但我不知道如何獲得我想要的行爲。在Python中,如何創建一個臨時文件直到下一次運行纔會持續運行?

目前,我做如下創建目錄:

randName = "temp" + str(random.randint(1000, 9999)) 
os.makedirs(randName) 

而當我想刪除的目錄,我只是看在其「臨時」的目錄。
這似乎是一個骯髒的黑客攻擊,但目前我不確定更好的方法。

順便說一句,我需要周圍的文件夾中的原因是,我開始使用該文件夾下面的過程:

subprocess.Popen([command], shell=True).pid 

然後退出我的腳本,讓其他進程完成這項工作。

+0

「這似乎是一個骯髒的黑客」?爲什麼?如果你在shell或其他語言中使用它,你會做同樣的事情。請詳細說明您不喜歡這個解決方案。 – 2009-02-24 14:12:13

+1

嗯,我不確定。我想這就像一個真正的Pythonista會有更乾淨的方式去做的事情。 真的感覺髒的部分是刪除.... – 2009-02-24 14:16:07

+0

再次 - 爲什麼?刪除不再使用的文件(或目錄)有什麼問題。從技術上講,該目錄的「使用者」在完成時應該刪除。但是清理有什麼問題? – 2009-02-24 14:26:37

回答

16

使用4位隨機數字創建文件夾是不安全的,您還需要擔心與程序的其他實例發生衝突。

一個更好的方法是使用tempfile.mkdtemp創建文件夾,該文件夾完全符合您的需要(即腳本退出時文件夾不會被刪除)。然後,您會將文件夾名稱作爲參數傳遞給第二個Popen'ed腳本,並且它將負責刪除它。

3

臨時文件是持續單個程序運行的東西。

因此,您所需要的不是臨時文件。另外,要注意單臺計算機上的多個用戶 - 只要用'temp'模式刪除任何內容,都可能是反社會的,因此如果該目錄位置不安全,就會加倍。

另外,請記住,在某些計算機上,/tmp文件系統在計算機重新引導時重建。

1

tempfile就好,但爲了安全起見,您需要在某個地方安全保存目錄名稱,直到下一次運行爲止,例如醃製它。然後在下一次運行中讀取並刪除目錄。並且您不需要爲根擁有/tmptempfile.mkdtemp具有可選的dir參數。但總的來說,這與現在正在做的事情沒有什麼不同。

4

「我需要創建一個僅使用一次的文件夾,但需要在下一次運行之前存在它。」

「順便說一句,我需要周圍的文件夾中的原因是,我開始一個過程......」

並不是偶然的,在所有。關鍵。

看來你有以下設計模式。

mkdir someDirectory 
proc1 -o someDirectory # Write to the directory 
proc2 -i someDirectory # Read from the directory 
if [ %? == 0 ] 
then 
    rm someDirectory 
fi 

這是你在shell級寫的東西嗎?

如果是這樣,請考慮將您的Python應用程序分爲幾個部分。

  • 即做實際工作( 「PROC1」 和 「PROC2」)的份

  • ,其管理資源和過程
  • 的殼;本質上是一個Python替代bash腳本。

8

你建議的是危險的。如果有其他人試圖創建這些目錄 - 包括您的應用程序的其他實例,您可能會遇到競爭狀況。另外,刪除包含「temp」的任何內容都可能導致刪除超出您的預期。正如其他人所說,tempfile.mkdtemp可能是最安全的方式。以下是您所描述內容的一個示例,包括啓動使用新目錄的子流程。

import tempfile 
import shutil 
import subprocess 

d = tempfile.mkdtemp(prefix='tmp') 
try: 
    subprocess.check_call(['/bin/echo', 'Directory:', d]) 
finally: 
    shutil.rmtree(d) 
1

創建臨時文件名的最好的方法是使用任一tempName.TemporaryFile(模式= 'W + B',後綴= 'TMP',prifix = 'someRandomNumber' DIR =無) 或u可以使用mktemp()函數。

mktemp()函數實際上不會創建任何文件,但會提供一個唯一的文件名(實際上不包含PID)。

2

你也可以自動註冊的功能,這樣做完全刪除任何退出的臨時目錄(有或無誤差):

import atexit 
import shutil 
import tempfile 

# create your temporary directory 
d = tempfile.mkdtemp() 

# suppress it when python will be closed 
atexit.register(lambda: shutil.rmtree(d)) 

# do your stuff... 
subprocess.Popen([command], shell=True).pid 
相關問題