Windows上的fcntl替代方案

91

我收到了一个Python项目(假设这是一个Django项目),其中使用了标准库中的fcntl模块,该模块似乎仅在Linux上可用。当我尝试在Windows机器上运行它时,出现了ImportError错误,因为此模块在此处不存在。

有没有办法对程序进行小幅修改,使其在Windows上运行?


2
代码在尝试使用fcntl做什么具体的事情?fcntl()可以完成许多不同的任务。 - Warren Young
3个回答

102

fcntl在Windows上的替代品是使用win32api调用。它们的用法完全不同,不能简单地切换使用。

换句话说,将一个依赖于fcntl的模块移植到Windows并不容易。这需要你分析每个fcntl调用具体的功能,并找到相应的win32api代码(如果有的话)。

同时,也有可能一些使用fcntl的代码在Windows上没有等价物,这就需要你更改模块API,甚至修改使用所移植模块的程序的结构/范例。

如果你提供有关fcntl调用的更多详细信息,则可以帮助人们查找Windows中的等效物。


你是否有关于在Windows上使用单个锁文件来同步其他文件是否安全的信息?尽管锁定文件可以很好地以原子方式锁定和解锁,但我们似乎仍然会遇到竞争条件。就像解锁它并没有为我们在保持锁定状态时编写的其他文件创建happens-before保证一样。 - Zyl
@Zyl,你正在评论的答案与锁定完全无关,它解释了fcntl/win32api调用,这些调用可以用于几乎任何事情;我不相信在Windows上有什么是安全的;我建议你提出另一个问题,而不是发表评论。 - nosklo

48

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

当然,你需要将fcntl.py模块放置在要使用的Python解释器的site-packages目录中。例如:%LOCALAPPDATA%\Programs\Python\Python310\lib\site-packages\fcntl\。这就是我的site-packages所在的位置。查看Tutorialspoint以查找你的位置。


3
这真是个简便的方法,但正是我所需要的。 :) - Tim Ludwinski
添加了数字常量。 - Tim Ludwinski
4
fcntl.F_GETFD和fcntl.F_SETFD是Python编程语言中的文件控制相关函数,分别用于获取和设置文件描述符标记。 - JimSEOW
10
链接似乎已经失效。 - Marc L.
1
如何将此添加到sys.path?我尝试将其添加到与我的Python脚本相同的文件夹中,但它没有起作用。 - luthfianto
显示剩余3条评论

17

虽然这并不能立即帮到你,但有一种备选方案可以在Unix(fcntl)和Windows(win32 api调用)中使用,称为:portalocker

它自称是Python的跨平台(posix / nt)API,用于flock风格的文件锁定。它基本上将fcntl映射到win32的api调用上。

最初的代码位于 http://code.activestate.com/recipes/65203/ ,现在可以安装为独立软件包 - https://pypi.python.org/pypi/portalocker


3
fcntl 做的事情不仅仅是锁定文件。 - c z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接