Подтвердить что ты не робот

Замена fcntl в Windows

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

Есть ли способ сделать небольшое изменение в программе, чтобы она работала в Windows?

4b9b3361

Ответ 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