2009-02-22 86 views
5

我在使用Python 2.5的windows上。我有一個用於寫作的公開文件。我寫了一些數據。調用文件關閉。當我嘗試使用Windows資源管理器從文件夾中刪除文件時,它出現錯誤,表示一個進程仍然保存文件的句柄。爲什麼在調用file.close()後Python不釋放文件句柄?

如果我關閉python,並再試一次,它會成功。

+0

我從來不知道Pythons發佈*任何*容易,讓可憐的小文件。 :P:P – Cerebrus 2009-02-22 15:37:20

+0

@Cerberus Tee hee! – Pitarou 2009-02-22 15:54:31

回答

4

它關閉它們。 你確定f.close()被調用嗎? 我剛剛測試過相同的場景,Windows爲我刪除了這個文件。

2

你是否正在處理文件對象的任何異常?如果是這樣,請確保錯誤處理看起來是這樣的:

f = open("hello.txt") 
try: 
    for line in f: 
     print line 
finally: 
    f.close() 

在考慮爲什麼要做到這一點,考慮下面的代碼行:

f = open('hello.txt') 
try: 
    perform_an_operation_that_causes_f_to_raise_an_exception() 
    f.close() 
except IOError: 
    pass 

正如你所看到的,f.close將永遠不會在上面的代碼中調用。問題是,上面的代碼也會導致f不會收集垃圾。原因是在sys.traceback中仍然會引用f,在這種情況下,唯一的解決方案是在finally塊中手動調用f上的close或將sys.traceback設置爲None(我強烈建議前者)。

3

教程解釋:

with open('/tmp/workfile', 'r') as f: 
    read_data = f.read() 

它的工作原理,當你寫或酸洗/在unpickle,太

這是不是真的有必要試圖finally塊:做事Java的方式,而不是Python

0

我一直在尋找這個,因爲同樣的事情發生在我身上。這個問題並沒有幫助我,但我想我知道發生了什麼。

在我寫的腳本的原始版本中,如果發生異常,我忽略在文件的'finally'子句中添加。

我在交互式提示符下測試腳本,並在文件打開時發生異常。我沒有意識到的是,文件對象並沒有立即被垃圾回收。之後,當我運行腳本時(仍然來自同一個交互式會話),即使關閉了文件對象,第一個文件對象仍然沒有被使用,所以文件句柄仍在使用中操作系統的角度。

一旦我關閉了交互式提示符,問題就消失了,我記得在文件打開時發生異常並意識到發生了什麼。 (道德:不要試圖對睡眠不足進行編程:))

當然,我不知道這是在原始海報的情況下發生了什麼,即使原始海報仍然在附近,他們可能不記得具體情況,但症狀是相似的,所以我想我會添加這個作爲檢查的東西,對於陷入相同情況並尋找答案的任何人。

相關問題