2015-09-02 103 views
0

我有兩個Python進程AB,並且都試圖寫入同一個文件。在A達到f = open("xx.txt", "w")之後,在關閉文件之前,我希望其他進程有辦法檢測到xx.txt正在使用中。檢測是否有另一個Python進程正在寫入文件

我試過f = open("xx.txt", "w")正在處理B但它沒有拋出任何異常。我也試過os.access("xx.txt", os.W_OK)B,它返回True

我知道我可以使用一些文件鎖定庫,如lockfilefcntl。但我想知道是否有任何簡單的解決方案,而不依賴於這些庫來檢測它?

編輯: 我發現了一個可能的解決方案:

使用os.open打開文件:

open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY) 
fd = os.open("xx.txt", open_flags) 

如果該文件已經存在,我們可以得到例外:

open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY) 
>>> fd = os.open("xx.txt", open_flags) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OSError: [Errno 17] File exists: 'xx.txt' 
+0

可能重複[檢查一個文件是否在Python中未打開(未由其他進程使用)](http://stackoverflow.com/questions/11114492/check-if-a-file-is-not-open-not-used-by-by-other-process-in-python) – taesu

+0

@taesu:這個問題是針對「檢查文件是否打開」,以及我的問題是「檢查文件是否正在寫入」。他們是不同的。沒有人提到在這個問題中使用'os.open'的答案。 – stanleyli

回答

-1

我發現了一個可能的解決方案(在我的情況該文件只需要進行一次寫入):

使用os.open打開文件:

open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY) 
fd = os.open("xx.txt", open_flags) 

,我們可以得到例外如果該文件已存在:

open_flags = (os.O_CREAT | os.O_EXCL | os.O_WRONLY) 
>>> fd = os.open("xx.txt", open_flags) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OSError: [Errno 17] File exists: 'xx.txt' 
0

一個難看的解決方案是在打開文件之前重命名該文件,並在處理完成後將其重命名。如果重命名起作用,則意味着其他進程沒有使用它。如果重命名失敗,則意味着文件已被重命名,因此當前正在使用中。

更好的解決方案是使用另一種進程間通信(管道,共享內存等)方法,如果需要持久化,可以使用一個簡單的數據庫,如sqlite。

相關問題