замена fcntl на Windows
Я получил проект Python (который, оказывается, является проектом Django, если это имеет значение), который использует fcntl модуль из стандартной библиотеки, которая, кажется, доступны только в Linux. Когда я пытаюсь запустить его на моей машине Windows, прекращается с ImportError, потому что этот модуль не существует здесь.
есть ли способ для меня, чтобы сделать небольшое изменение в программу, чтобы заставить его работать на Windows?
3 ответов:
замена
fcntlокнаwin32apiзвонки. Использование совершенно другое. Это не какой-то переключатель, который вы можете просто перевернуть.другими словами, портирование a
fcntl-тяжелый пользовательский модуль для windows не является тривиальным. Он требует от вас проанализировать, что именно каждыйfcntlвызов делает, а затем найти эквивалентwin32apiкод, если таковые имеются.есть также возможность, что какой-то код с помощью
fcntlне имеет эквивалента windows, что потребует от вас изменить модуль 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
Comments