2013-07-01 30 views
6

在我的程序中,如果當前文件不存在,許多進程可以嘗試創建文件。 現在我想確保只有其中一個進程能夠創建該文件,其餘的如果它已經被創建(類型的進程安全和線程安全的open()實現)會得到一個異常。 我如何在Python中實現這一點。如何創建文件並拋出異常(如果已經存在)

爲了清楚起見,我想要的是如果文件不存在,就創建文件。但是如果它已經存在然後拋出一個異常。這一切都應該發生在原子上。

回答

6

在Python 2.x的:

import os 

fd = os.open('filename', os.O_CREAT|os.O_EXCL) 
with os.fdopen(fd, 'w') as f: 
    .... 

在Python 3.3+:

with open('filename', 'x') as f: 
    .... 
+0

該代碼實現了所需的功能。 – Adobri

+0

@naxa,Python 3.3+的文檔['open(...,'x')'](https://docs.python.org/3/library/functions.html#open)沒有任何可用性信息;這通常意味着它支持所有平臺。儘管Python 2.x ['os.fdopen'](https://docs.python.org/2/library/os.html#os.fdopen)的文檔提到了可用性:Unix,Windows。 – falsetru

+1

@naxa,根據[文檔:open()標誌常量](https://docs.python.org/2/library/os.html#open-flag-constants):以下常量是標誌的選項參數給open()函數。它們可以使用按位或運算符|進行組合。其中一些不適用於所有平臺。有關它們的可用性和使用的說明,請參閱Unix上的open(2)手冊頁或Windows上的MSDN。 – falsetru

4

如果您在類Unix系統上運行,打開這樣的文件:

f = os.fdopen(os.open(filename, os.O_CREAT | os.O_WRONLY | os.O_EXCL), 'w') 

O_EXCL標誌os.open確保該文件將只創建(打開),如果它不」 t已經存在,否則會引發一個OSError異常。存在檢查和創建將以原子方式執行,因此您可以讓多個線程或進程爭奪創建該文件,並且只有一個會成功。

+0

這兩項常數應是[適用於Windows以及](HTTP://docs.python。組織/ 2 /庫/ os.html#開放的標誌常數)。 –

+1

常量可能是可用的,但我不敢聲稱沒有一些研究就會以相同的方式實現原子性。 – user4815162342

+0

我想我所要求的是,如果文件不存在,打開它,但如果它存在(已由另一個進程創建),則拋出異常。看起來這個代碼會拋出異常,如果該文件不在那裏,並且如果它存在就會通過。 – Adobri

相關問題