Замінник fcntl у Windows


77

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

Чи є для мене спосіб внести невелику зміну в програму, щоб вона працювала в Windows?


2
Що конкретно намагається зробити код з fcntl? fcntl () робить багато різних речей.
Уоррен Янг

Відповіді:


81

Замінником fcntlWindows є win32apiдзвінки. Використання зовсім інше. Це не якийсь перемикач, який ви можете просто перекинути.

Іншими словами, перенесення fcntlмодуля -heavy-user на windows не є тривіальним. Це вимагає від вас проаналізувати, що саме fcntlробить кожен виклик, а потім знайти еквівалентний win32apiкод, якщо такий є.

Також існує ймовірність того, що якийсь код, що використовує fcntl, не має еквівалента windows, що вимагає змінити api модуля і, можливо, структуру / парадигму програми, використовуючи модуль, який ви переносите.

Якщо ви надасте більше подробиць про fcntlдзвінки, люди можуть знайти еквіваленти windows.


38

Модуль 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
Це такий хак; але це те, що мені потрібно було. :)
Тім Людвінський

Додано числові константи.
Тім Людвінський

4
Як щодо fcntl.F_GETFD та fcntl.F_SETFD
JimSEOW

7
посилання виявляється порушеним
Марк Л.

1
Як додати це до sys.path? Я спробував додати це в ту ж папку, що і мій сценарій python, але це не спрацювало
rilut

16

Хоча це вам не допомагає відразу, є альтернатива, яка може працювати як з Unix (fcntl), так і з Windows (виклики win32 api), називається: portalocker

Він описує себе як крос-платформний (posix / nt) API для блокування файлів у стилі flock для Python. Це в основному відображає fcntl для викликів викликів API 32.

Оригінальний код за адресою http://code.activestate.com/recipes/65203/ тепер можна встановити як окремий пакет - https://pypi.python.org/pypi/portalocker


1
fcntlробить набагато більше речей, ніж блокування файлів.
cz,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.