Замена fcntl в Windows
Я получил проект Python (который, случается, проект Django, если это имеет значение), который использует модуль fcntl
из стандартной библиотеки, который, кажется, доступен только в Linux. Когда я пытаюсь запустить его на своей машине Windows, он останавливается с помощью ImportError
, потому что этот модуль здесь не существует.
Есть ли способ сделать небольшое изменение в программе, чтобы она работала в Windows?
Ответы
Ответ 1
Подменю fcntl
в окнах - это вызовы win32api
. Использование совершенно другое. Это не какой-то переключатель, который вы можете просто перевернуть.
Другими словами, перенос модуля fcntl
-heavy-user в windows не является тривиальным. Это требует, чтобы вы проанализировали, что именно происходит с каждым вызовом fcntl
, а затем найдите эквивалентный код win32api
, если таковой имеется.
Также существует вероятность того, что какой-то код с использованием fcntl
не имеет эквивалентов окон, что потребует от вас изменить модуль api и, возможно, структуру/парадигму программы, используя модуль, который вы переносите.
Если вы предоставите более подробную информацию о вызовах fcntl
, люди могут найти эквиваленты Windows.
Ответ 2
Модуль 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
Ответ 3
Хотя это вам не поможет сразу, есть альтернатива, которая может работать как с Unix (fcntl), так и с Windows (вызовы win32 api): portalocker
Он описывает себя как кросс-платформенный (posix/nt) API для блокировки файлов стиля для Python. Он в основном отображает fcntl на вызовы win32 api.
Исходный код http://code.activestate.com/recipes/65203/ теперь может быть установлен как отдельный пакет - https://pypi.python.org/pypi/portalocker