Windows上的fcntl替代品


77

我收到了一个使用fcntl标准库中的模块的Python项目(如果需要的话,它恰好是Django项目),该库似乎仅在Linux上可用。当我尝试在Windows计算机上运行它时,它会以停止ImportError,因为此模块在此处不存在。

我有什么办法可以对程序进行一些小的更改以使其在Windows上运行?


2
该代码试图与fcntl具体做什么?fcntl()做许多不同的事情。
沃伦·杨

Answers:


81

fcntlWindows上的替代项是win32api调用。用法是完全不同的。这不是您可以直接拨动的开关。

换句话说,将fcntl-heavy-user模块移植到Windows并非易事。它要求您分析每个fcntl调用的确切功能,然后找到等效的win32api代码(如果有)。

也有可能某些使用的代码fcntl没有等效的Windows,这将要求您使用要移植的模块来更改模块api,并可能更改程序的结构/范例。

如果您提供有关fcntl呼叫的更多详细信息,人们可以找到Windows等效项。


37

fcntl模块仅用于锁定固定文件,因此,假设您不尝试多路访问,这是可以接受的解决方法。将此模块放在您的中sys.path,它应该可以作为正式的fcntl模块使用。

尝试仅在Windows中将此模块用于开发/测试目的。

def fcntl(fd, op, arg=0):
    return 0

def ioctl(fd, op, arg=0, mutable_flag=True):
    if mutable_flag:
        return 0
    else:
        return ""

def flock(fd, op):
    return

def lockf(fd, operation, length=0, start=0, whence=0):
    return

3
这是一个骇客。但这就是我所需要的 :)
蒂姆·卢德温斯基

添加了数字常量。
蒂姆·卢德温斯基

4
怎么样fcntl.F_GETFD和fcntl.F_SETFD
JimSEOW

7
链接似乎已断开
Marc

1
如何将此添加到sys.path?我尝试将其添加到与我的python脚本相同的文件夹中,但是没有起作用
rilut

16

尽管这不能立即为您提供帮助,但是还有一种可以与Unix(fcntl)和Windows(win32 api调用)一起使用的替代方法,称为:portalocker

它将自己描述为跨平台(posix / nt)API,用于Python的羊群式文件锁定。它基本上将fcntl映射到win32 api调用。

现在可以将http://code.activestate.com/recipes/65203/上的原始代码作为单独的软件包安装-https: //pypi.python.org/pypi/portalocker


1
fcntl除了锁定文件外,还可以做更多的事情。
CZ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.