2012-06-27 33 views
5

我需要開發一個腳本,將啓動一些計算。希望這個腳本通過刪除一些臨時目錄來正確處理^ C。我已經試過的代碼的幾個版本中signal_handler:Python,刪除目錄:錯誤文件存在

shutil.rmtree(self.temp) 

甚至

os.system("rm -rf " + self.temp) 

當我中斷執行和處理程序被調用來刪除目錄,我得到這樣的錯誤:

OSError: [Errno 17] File exists : 'foo' 

rm: Unable to remove directory foo: File exists 

執行後,我要刪除的目錄是空的,我可以用shell中的rm -r將其刪除。但是,如果我執行代碼:

for f in os.listdir(self.temp): 
    os.remove(os.path.join(self.temp,f)) 

for f in os.listdir(self.temp): 
    print f 

os.rmdir(self.temp) 

我,當然,收到錯誤,但第二循環認爲這個文件:.nfsA13D3

任何人都有一個解決我的問題? 謝謝!

+6

當某個NFS掛載的文件仍然在使用中時,'.nfs *'文件被創建。一旦'.nfs'文件的引用計數降到0,它*應該*消失(我遇到過去並不總是這樣的情況,但需要手動清除)。 – twalberg

回答

0

感謝您的評論,我打開了我的Python代碼中的文件,我的signal_handler沒有檢查我的文件對象是否關閉。這就是爲什麼我無法刪除腳本中包含這些文件的目錄。

7

這是一個衆所周知的問題,nfs安裝的文件系統你的一些實用程序沒有關閉文件。即使刪除文件,操作系統也可以使文件保持活動狀態,但在涉及nfs時,這是不可能的。 os的解決方案是創建臨時.nfs文件,並保留它,直到文件描述符被使用。

這個問題沒有真正的解決方案。當最後一個描述符關閉時,.nfs文件將消失,但(空)目錄仍然存在。唯一可能的解決方法是找到仍然打開的文件描述符並關閉它,但這取決於它是否在您的程序中。就我而言,這是在一個外部編譯的庫中,我沒有機會找到它泄漏的地方。