Замена fcntl в Windows
Я получил проект Python (который является проектом Django, если это имеет значение), который использует fcntl
модуль из стандартной библиотеки, который, кажется, доступен только в Linux. Когда я пытаюсь запустить его на моем компьютере с Windows, он останавливается с ImportError
потому что этот модуль не существует здесь.
Можно ли как-нибудь изменить программу, чтобы она работала в Windows?
3 ответа
Заменитель fcntl
на окнах есть win32api
звонки. Использование совершенно другое. Это не какой-то переключатель, который вы можете просто щелкнуть.
Другими словами, портирование fcntl
-Heavy-пользовательский модуль для Windows не является тривиальным. Требуется проанализировать, что именно каждый fcntl
позвоните, а затем найти эквивалент win32api
код, если есть.
Также существует вероятность того, что какой-то код использует fcntl
не имеет оконного эквивалента, что потребовало бы изменения API-модуля и, возможно, структуры / парадигмы программы с использованием переносимого вами модуля.
Если вы предоставите более подробную информацию о fcntl
звонки люди могут найти эквиваленты Windows.
Модуль 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
Хотя это не поможет вам сразу, есть альтернатива, которая может работать как с 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