Mac OS X上的Python posxifile.lock()IOError

Mac OS X上的Python posxifile.lock()IOError,python,macos,locking,Python,Macos,Locking,在Mac OS X上实现简单文件锁定失败: import posixfile f = posixfile.open('a', 'w') f.lock('w') 运行时,这会导致以下异常: IOError: [Errno 22] Invalid argument 是我做错了,还是OSX真的不支持这个?如果它实际上不受支持,那么OSX的哪些方面会阻止它工作 我知道我可以改用fcntl,但是posixfile的语法看起来非常干净。正如你从下面顶部附近的粉红色大框中看到的: 自版本1.5以来已弃用

在Mac OS X上实现简单文件锁定失败:

import posixfile

f = posixfile.open('a', 'w')
f.lock('w')
运行时,这会导致以下异常:

IOError: [Errno 22] Invalid argument
是我做错了,还是OSX真的不支持这个?如果它实际上不受支持,那么OSX的哪些方面会阻止它工作


我知道我可以改用
fcntl
,但是
posixfile
的语法看起来非常干净。

正如你从下面顶部附近的粉红色大框中看到的:

自版本1.5以来已弃用:通过fcntl.lockf()调用,此模块提供的锁定操作可以更好地完成,并且更便于移植

这意味着它在1997年被弃用。MacOSX当时甚至还不是一个想法,第一个版本是在2001年发布的

因此,没有人为这个模块编写特定于OSX的实现也就不足为奇了。令人惊讶的是,它直到3.0才被完全删除


如果你想知道为什么它不起作用,看看。如果不深入研究细节,您可以立即看到有*BSD、AIX和其他未指定的代码(AT&T SysV和100%兼容?)。请注意,“darwin”不在*BSD平台的列表中,因此它将被归入“其他东西”。如果您查看OSX手册页,其
struct flock
显然是BSD布局,正如您所期望的,而不是“其他”布局

因此,您正在将一个类型为(h)-whence(h)-start(l)-len(l)-sysid(h)-pid(h)的结构传递给一个期望start(q)-len(q)-pid(l)-type(h)-whence(h)的API。幸运的是,您得到的是I/O错误,而不是segfault


事实上,即使将“darwin”添加到BSD名称列表中,该代码仍然不正确,因为它丢弃了start和len的前32位,并用pad zero替换它们。(这在现代FreeBSD和其他*BSD平台上可能也是错误的。)

完美答案。谢谢我没有读过这个网页,我在其他网站上找到了一个例子,然后使用了
pydoc
,其中没有提到弃用。我将切换到使用
fcntl
@bahamat:如果您喜欢posixfile的接口,我打赌您可以用一个文件加上fcntl自己构建一个等价的类。甚至有人可能已经在PyPI或ActiveState上这样做了。