我在使用Python 2.5的windows上。我有一個用於寫作的公開文件。我寫了一些數據。調用文件關閉。當我嘗試使用Windows資源管理器從文件夾中刪除文件時,它出現錯誤,表示一個進程仍然保存文件的句柄。爲什麼在調用file.close()後Python不釋放文件句柄?
如果我關閉python,並再試一次,它會成功。
我在使用Python 2.5的windows上。我有一個用於寫作的公開文件。我寫了一些數據。調用文件關閉。當我嘗試使用Windows資源管理器從文件夾中刪除文件時,它出現錯誤,表示一個進程仍然保存文件的句柄。爲什麼在調用file.close()後Python不釋放文件句柄?
如果我關閉python,並再試一次,它會成功。
它關閉它們。 你確定f.close()被調用嗎? 我剛剛測試過相同的場景,Windows爲我刪除了這個文件。
你是否正在處理文件對象的任何異常?如果是這樣,請確保錯誤處理看起來是這樣的:
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(我強烈建議前者)。
教程解釋:
with open('/tmp/workfile', 'r') as f:
read_data = f.read()
它的工作原理,當你寫或酸洗/在unpickle,太
這是不是真的有必要試圖finally塊:做事Java的方式,而不是Python
我一直在尋找這個,因爲同樣的事情發生在我身上。這個問題並沒有幫助我,但我想我知道發生了什麼。
在我寫的腳本的原始版本中,如果發生異常,我忽略在文件的'finally'子句中添加。
我在交互式提示符下測試腳本,並在文件打開時發生異常。我沒有意識到的是,文件對象並沒有立即被垃圾回收。之後,當我運行腳本時(仍然來自同一個交互式會話),即使關閉了文件對象,第一個文件對象仍然沒有被使用,所以文件句柄仍在使用中操作系統的角度。
一旦我關閉了交互式提示符,問題就消失了,我記得在文件打開時發生異常並意識到發生了什麼。 (道德:不要試圖對睡眠不足進行編程:))
當然,我不知道這是在原始海報的情況下發生了什麼,即使原始海報仍然在附近,他們可能不記得具體情況,但症狀是相似的,所以我想我會添加這個作爲檢查的東西,對於陷入相同情況並尋找答案的任何人。
我從來不知道Pythons發佈*任何*容易,讓可憐的小文件。 :P:P – Cerebrus 2009-02-22 15:37:20
@Cerberus Tee hee! – Pitarou 2009-02-22 15:54:31