web-dev-qa-db-fra.com

substitut fcntl sous Windows

J'ai reçu un projet Python (qui se trouve être un projet Django, si cela importe)) qui utilise le module fcntl de la norme bibliothèque, qui ne semble être disponible que sous Linux. Lorsque j'essaye de l'exécuter sur ma machine Windows, elle s'arrête avec un ImportError, car ce module n'existe pas ici.

Existe-t-il un moyen pour moi d'apporter une petite modification au programme pour le faire fonctionner sous Windows?

62
Ram Rachum

Le substitut de fcntl sur Windows est win32api appels. L'utilisation est complètement différente. Ce n'est pas un interrupteur que vous pouvez simplement retourner.

En d'autres termes, le portage d'un fcntl - module utilisateur lourd vers Windows n'est pas anodin. Cela vous oblige à analyser ce que fait exactement chaque appel fcntl, puis à trouver l'équivalent win32api code, le cas échéant.

Il y a aussi la possibilité qu'un code utilisant fcntl n'ait pas d'équivalent Windows, ce qui vous obligerait à changer l'api du module et peut-être la structure/le paradigme du programme en utilisant le module que vous portez.

Si vous fournissez plus de détails sur les appels fcntl, les utilisateurs peuvent trouver des équivalents Windows.

69
nosklo

Le module fcntl est juste utilisé pour verrouiller le fichier d'épinglage, donc en supposant que vous n'essayez pas l'accès multiple, cela peut être une solution de contournement acceptable. Placez ce module dans votre sys.path, et il devrait simplement fonctionner comme le module fcntl officiel.

Essayez d'utiliser ce module à des fins de développement/test uniquement dans 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
31
Muhammad Soliman

Bien que cela ne vous aide pas tout de suite, il existe une alternative qui peut fonctionner avec Unix (fcntl) et Windows (appels api win32), appelée: portalocker

Il se décrit comme une API multiplateforme (posix/nt) pour le verrouillage de fichiers de style flock pour Python. Il mappe fondamentalement fcntl aux appels api win32.

Le code d'origine à http://code.activestate.com/recipes/65203/ peut maintenant être installé dans un package séparé - https://pypi.python.org/pypi/ portalocker

16
Joeri