Замена 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

Другие вопросы по тегам