2011-04-27 30 views
3

我有這樣的代碼:蟒蛇臨時文件

import tempfile 
def tmp_me(): 
    tmp = tempfile.NamedTemporaryFile() 
    tmp1 = tempfile.NamedTemporaryFile() 
    lst = [tmp.name, tmp1.name] 
    return lst 

def exit_dialog(): 
    lst = tmp_me() 
    print lst 
    import filecmp 
    eq = filecmp.cmp(lst[0],lst[1]) 
    print eq 

exit_dialog() 

我需要比較這2個臨時文件,但我總是得到這樣的錯誤:

WindowsError: [Error 2] : 'c:\\users\\Saul_Tigh\\appdata\\local\\temp\\tmpbkpmeq' 
+2

這不是完整的追溯。 – delnan 2011-04-27 10:36:07

+0

是真的,我試圖在我的小項目中使用它。我正在用Tkinter寫一個簡單的記事本。 – 2011-04-27 17:04:33

回答

10

錯誤2是該文件未找到(ERROR_FILE_NOT_FOUND)。

NamedTemporaryFile具有delete參數,默認設置爲True。您確定該文件在您的tmp_me方法返回時沒有被立即刪除嗎?

你可以嘗試使用:

tempfile.NamedTemporaryFile(delete=False) 
+0

Nah。最好保持目標周圍。 – 2011-04-27 10:41:54

+0

+1。我認爲這是怎麼回事。當函數返回並刪除文件時,局部變量'tmp'和'tmp1'被破壞。 – 2011-04-27 10:42:26

+0

@Ignacio,你說的對,但我認爲這個應用程序幾乎沒有完成,所以有希望隨着時間的推移而有所不同。 – 2011-04-27 10:43:36

2

下面是完整的錯誤消息,我得到

WindowsError: [Error 2] The system cannot find the file specified: 'c:\\users\\imran\\appdata\\local\\temp\\tmpqh7dfp' 

發生這種情況,因爲當tmp_me()函數返回引用到臨時文件對象丟失,文件和臨時文件在變量被垃圾收集時從磁盤中刪除。

你可以從tmp_me()返回臨時文件的對象,但你必須先關閉文件之前,你可以用filecmp.cmp

4

測試他們,你有沒有給予了充分的追蹤,但我幾乎可以肯定錯誤是因爲在tmp_me()返回時,臨時文件已被刪除。您返回兩個臨時創建的文件的名稱,並在函數返回時銷燬名爲tmp和tmp_1的對象,並沿着它們創建的文件進行刪除。你在外面得到的只是兩個臨時文件的名稱,它們現在不再存在,因此在試圖比較它們時出現錯誤。

tempfile.NamedTemporaryFile文檔:

如果刪除爲真(默認),該文件一旦它被關閉刪除。

要麼將​​默認值False傳遞給您的NameTemporaryFile調用,您應該在其中自己刪除文件。或者更好,首選方法是返回的對象,而不是他們的名字,並從exit_dialog()方法傳遞。名稱s到filecmp.cmp

import tempfile 
def tmp_me(): 
    tmp1 = tempfile.NamedTemporaryFile() 
    tmp2 = tempfile.NamedTemporaryFile() 
    return [tmp1, tmp2] 


def exit_dialog(): 
    lst = tmp_me() 
    print [i.name for i in lst] 
    import filecmp 
    eq = filecmp.cmp(lst[0].name,lst[1].name) 
    print eq 

exit_dialog() 
8

有無temp_me返回兩個臨時文件的列表,而不是隻是他們的名字(所以他們不會被垃圾收集),並將名字排除在exit_dialog