2013-10-11 46 views
2

實現簡單的文件鎖定Mac OS X上失敗:Python的posxifile.lock()的IOError在Mac OS X

import posixfile 

f = posixfile.open('a', 'w') 
f.lock('w') 

在運行時這將導致以下異常:

IOError: [Errno 22] Invalid argument 

我做它錯誤,還是OS X真的不支持這個?如果它實際上不受支持,那麼OS X會妨礙它的工作?

我知道我可以使用fcntl來代替,但posixfile的語法看起來非常乾淨。

回答

2

你可以從巨大的粉色框中看到附近的the module's docs頂部:

自1.5版本不推薦使用:鎖定操作,該模塊提供完成由fcntl.lockf更好,更便攜( )電話。

這意味着它在1997年的Mac OS X棄用甚至根本不存在如在這一點上的想法,第一個版本於2001年

所以發佈,這並不奇怪,沒人編寫了該模塊的OS X特定實現。令人驚訝的是,它直到3.0才被完全刪除。


如果你想知道它爲什麼不起作用,請看the source。如果不仔細觀察細節,您可以立即看到* BSD,AIX和其他未指定的代碼(SysV和100%兼容?)。請注意,「達爾文」不在* BSD平臺列表中,因此它將轉入「其他」。如果你看看OS X的手冊頁fcntl,它的struct flock顯然是你所期望的BSD佈局,而不是「其他」佈局。 (h)-start(l)-len(l)-sysid(h)-pid(h)的結構傳遞給一個預計開始的API(q) )-len(q)-pid(升)型(H)-whence(H)。你很幸運會得到一個I/O錯誤而不是段錯誤。

事實上,即使您將「darwin」添加到BSD名稱列表中,該代碼仍然不正確,因爲它拋棄了start和len的前32位,並用填零替換它們。 (這在現代FreeBSD和其他* BSD平臺上可能是錯誤的。)

+0

完美答案。謝謝。我沒有閱讀網頁,我在其他網站上找到了一個例子,然後使用'pydoc',它沒有提到棄用。我將切換到使用'fcntl'。 – bahamat

+0

@bahamat:如果你喜歡posixfile的界面,我敢打賭你可以用一個文件加fcntl來自己構建一個等效的類。有人甚至可能已經在PyPI或ActiveState上這樣做了。 – abarnert