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上的任何替代方案?
GCC 和 clang 上的 MSVC /Zp 替代方案是啥?
使用Windows上的套接字/路径将MySQL工作台连接到MAMP