замена fcntl в Windows - PullRequest
       31

замена fcntl в Windows

62 голосов
/ 14 сентября 2009

Я получил проект Python (который является проектом Django, если это имеет значение), который использует модуль fcntl из стандартной библиотеки, которая, кажется, доступна только в Linux. Когда я пытаюсь запустить его на моем компьютере с Windows, он останавливается с ImportError, потому что этот модуль здесь не существует.

Можно ли как-нибудь изменить программу, чтобы она работала в Windows?

Ответы [ 3 ]

69 голосов
/ 14 сентября 2009

Заменой fcntl на окнах являются win32api звонки. Использование совершенно другое. Это не какой-то переключатель, который вы можете просто щелкнуть.

Другими словами, перенос модуля fcntl -heavy-user в Windows не является тривиальным. Требуется проанализировать, что именно делает каждый вызов fcntl, а затем найти эквивалентный код win32api, если таковой имеется.

Существует также вероятность того, что некоторый код, использующий fcntl, не имеет эквивалента Windows, что потребует от вас изменения API-модуля и, возможно, структуры / парадигмы программы с использованием переносимого вами модуля.

Если вы предоставите более подробную информацию о fcntl звонках, люди смогут найти эквиваленты Windows.

30 голосов
/ 24 августа 2014

Модуль 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
16 голосов
/ 03 апреля 2012

Хотя это не поможет вам сразу, есть альтернатива, которая может работать как с Unix (fcntl), так и с Windows (вызовы Win32 API), называемая: portalocker

Он описывает себя как кроссплатформенный (posix / nt) API для блокировки файлов в стиле flock для Python. Он в основном отображает fcntl на вызовы win32 api.

Исходный код http://code.activestate.com/recipes/65203/ теперь можно установить как отдельный пакет - https://pypi.python.org/pypi/portalocker

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...