2009-09-14 6 views
53

J'ai reçu un projet Python (qui se trouve être un projet Django, si cela est important), qui utilise le module fcntl de la bibliothèque standard, qui semble être disponible uniquement sous Linux. Lorsque j'essaie de l'exécuter sur mon ordinateur Windows, il s'arrête avec un ImportError, car ce module n'existe pas ici.fcntl substitut sur Windows

Y at-il un moyen pour moi de faire un petit changement dans le programme pour le faire fonctionner sur Windows?

+1

Qu'est-ce que le code tente de faire avec fcntl? fcntl() fait beaucoup de choses différentes. –

Répondre

60

Le substitut de fcntl sur les fenêtres sont win32api appels. L'utilisation est complètement différente. Ce n'est pas un interrupteur que vous pouvez simplement inverser. En d'autres termes, le portage d'un module utilisateur lourd fcntl vers Windows n'est pas trivial. Cela vous oblige à analyser exactement ce que chaque appel fcntl fait et ensuite trouver le code équivalent win32api, le cas échéant.

Il est également possible qu'un code utilisant fcntl n'ait pas d'équivalent windows, ce qui nécessiterait de changer le module api et peut-être la structure/paradigme du programme en utilisant le module que vous portez.

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

16

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

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

Le code original à http://code.activestate.com/recipes/65203/ peut désormais être installé comme un paquet séparé - https://pypi.python.org/pypi/portalocker

28

Le module fcntl est juste utilisé pour verrouiller le fichier épinglant, donc en supposant que vous essayez pas accès multiple, cela peut être un moyen acceptable solution de contournement. Placez ce module dans votre PYTHONPATH, et il devrait fonctionner comme le module officiel de fcntl. Essayez d'utiliser this 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 
+0

Ceci est un tel hack; mais c'est ce dont j'avais besoin. :) –

+0

Constantes numériques ajoutées. –

+1

Que diriez-vous de fcntl.F_GETFD et fcntl.F_SETFD – JimSEOW