关于python:Windows上的fcntl替代品

fcntl substitute on Windows

我收到了一个使用标准库中的fcntl模块的python项目(如果这很重要的话,它正好是一个django项目),该库似乎只在Linux上可用。当我试图在我的Windows机器上运行它时,它会在ImportError上停止,因为这里不存在这个模块。

我有没有办法在程序中做一个小改动,使它在Windows上工作?


windows上的fcntl替换为win32api调用。用法完全不同。这不是一个你可以随意翻转的开关。

换言之,将大量用户模块移植到Windows中并不容易。它要求您分析每个fcntl调用执行的操作,然后找到等效的win32api代码(如果有)。

还有一种可能性是,某些使用fcntl的代码没有与windows等效的代码,这将要求您更改模块API,或者更改使用所移植模块的程序的结构/范式。

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


fcntl模块仅用于锁定固定文件,因此假设您不尝试多次访问,这可能是一个可接受的解决方法。把这个模块放在你的sys.path中,它应该只作为正式的fcntl模块工作。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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


虽然这并不能立即帮助您,但有一种替代方法可以同时用于Unix(FCNTL)和Windows(Win32 API调用),称为:PortalLocker

它将自己描述为一个跨平台(POSIX/NT)API,用于针对Python的集群式文件锁定。它基本上将fcntl映射到win32 api调用。

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