Windows 上的 fcntl 替代品

Posted

技术标签:

【中文标题】Windows 上的 fcntl 替代品【英文标题】:fcntl substitute on Windows 【发布时间】:2010-11-28 04:28:05 【问题描述】:

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

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

【问题讨论】:

代码试图用 fcntl 做什么? fcntl() 做了很多不同的事情。 【参考方案1】:

fcntl 在 Windows 上的替代品是 win32api 调用。用法完全不同。这不是你可以随便拨动的开关。

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

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

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

【讨论】:

【参考方案2】:

虽然这不会立即帮助您,但有一个替代方案可以同时用于 Unix (fcntl) 和 Windows(win32 api 调用),称为:portallocker

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

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

【讨论】:

fcntl 比锁定文件做了更多的事情。【参考方案3】:

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

尝试仅在 Windows 中将this module (source) 用于开发/测试目的。

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.F_GETFD 和 fcntl.F_SETFD 怎么样 链接似乎已损坏 如何将它添加到 sys.path?我尝试将其添加到与我的 python 脚本相同的文件夹中,但它不起作用

以上是关于Windows 上的 fcntl 替代品的主要内容,如果未能解决你的问题,请参考以下文章

Python - PyPDF2错过了大量的文本。 Windows上的任何替代方案?

arcmap在mac上的替代品

GCC 和 clang 上的 MSVC /Zp 替代方案是啥?

使用Windows上的套接字/路径将MySQL工作台连接到MAMP

iPhone 上的 MPMoviePlayerController 替代品?

杂种怎么了? Windows上有啥替代品吗?