2009-09-14 22 views
53

Ich erhielt ein Python-Projekt (das ist ein Django-Projekt, wenn das wichtig ist), das fcntl-Modul aus der Standardbibliothek verwendet, die nur unter Linux verfügbar scheint. Wenn ich versuche, es auf meinem Windows-Rechner auszuführen, stoppt es mit einem ImportError, weil dieses Modul hier nicht existiert.fcntl ersetzen unter Windows

Gibt es eine Möglichkeit für mich, eine kleine Änderung im Programm vorzunehmen, damit es unter Windows funktioniert?

+1

Was genau versucht der Code mit fcntl zu tun? fcntl() macht viele verschiedene Dinge. –

Antwort

60

Der Ersatz von fcntl auf Windows sind win32api Aufrufe. Die Verwendung ist völlig anders. Es ist nicht irgendein Schalter, den Sie einfach umdrehen können.

Mit anderen Worten, Portierung eines fcntl-heavy-User-Moduls auf Windows ist nicht trivial. Es erfordert, dass Sie analysieren, was genau fcntl Aufruf tut und dann den entsprechenden Code win32api finden, falls vorhanden.

Es gibt auch die Möglichkeit, dass ein Code, der fcntl verwendet, keine Windows-Entsprechung hat, was erfordert, dass Sie die Modul-API und vielleicht die Struktur/das Paradigma des Programms ändern, das das Modul verwendet, das Sie portieren.

Wenn Sie weitere Details über die fcntl Anrufe bieten Menschen können Windows-Äquivalente finden.

16

Obwohl dies Sie nicht sofort helfen, gibt es eine Alternative, die sowohl mit Unix (fcntl) und Windows (Win32-API-Aufrufe), genannt arbeiten können: portalocker

Er beschreibt sich selbst als Quer Plattform (Posix/nt) API für die Flock-Stil-Dateisperre für Python. Im Grunde wird fcntl auf win32-api-Aufrufe abgebildet.

kann Der ursprüngliche Code in http://code.activestate.com/recipes/65203/ jetzt als separates Paket installiert werden - https://pypi.python.org/pypi/portalocker

28

Das Fcntl Modul zum Sperren der Pinning-Datei nur verwendet wird, so dass Sie nicht versuchen, Mehrfachzugriff unter der Annahme, dies eine akzeptable sein kann Problemumgehung. Platziere dieses Modul in deinem PYTHONPATH und es sollte nur als offizielles fcntl-Modul funktionieren.

Versuchen Sie, this module für Entwicklungs-/Testzwecke nur in Windows zu verwenden.

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

Das ist so ein Hack; aber es ist was ich brauchte. :) –

+0

Hinzugefügt numerische Konstanten. –

+1

Wie wäre es mit fcntl.F_GETFD und fcntl.F_SETFD – JimSEOW