fcntl Ersatz unter Windows

76

Ich habe ein Python-Projekt erhalten (das zufällig ein Django-Projekt ist, wenn das wichtig ist), das das fcntlModul aus der Standardbibliothek verwendet, die anscheinend nur unter Linux verfügbar ist. Wenn ich versuche, es auf meinem Windows-Computer auszuführen, wird es mit einem beendet ImportError, da dieses Modul hier nicht vorhanden ist.

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

Ram Rachum
quelle
2
Was genau versucht der Code mit fcntl zu tun? fcntl () macht viele verschiedene Dinge.
Warren Young

Antworten:

80

Der Ersatz für fcntlOn Windows sind win32apiAufrufe. Die Verwendung ist völlig anders. Es ist kein Schalter, den man einfach umlegen kann.

Mit anderen Worten, das Portieren eines fcntl-heavy-user-Moduls nach Windows ist nicht trivial. Sie müssen analysieren, was genau jeder fcntlAnruf bewirkt, und dann den entsprechenden win32apiCode finden, falls vorhanden.

Es besteht auch die Möglichkeit, dass ein Teil des verwendeten Codes fcntlkeine Windows-Entsprechung aufweist, sodass Sie die Modul-API und möglicherweise die Struktur / das Paradigma des Programms mithilfe des zu portierenden Moduls ändern müssen.

Wenn Sie weitere Details zu den fcntlAnrufen angeben, können Benutzer Windows-Entsprechungen finden.

nosklo
quelle
37

Das fcntl-Modul wird nur zum Sperren der Pinning-Datei verwendet. Wenn Sie also keinen Mehrfachzugriff versuchen, kann dies eine akzeptable Problemumgehung sein. Platzieren Sie dieses Modul in Ihrem sys.pathund es sollte nur als offizielles fcntl-Modul funktionieren.

Versuchen Sie, dieses Modul nur in Windows für Entwicklungs- / Testzwecke 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
Muhammad Soliman
quelle
3
Das ist so ein Hack; aber es ist was ich brauchte. :)
Tim Ludwinski
Numerische Konstanten hinzugefügt.
Tim Ludwinski
4
Wie wäre es mit fcntl.F_GETFD und fcntl.F_SETFD
JimSEOW
7
Link scheint unterbrochen zu sein
Marc L.
1
Wie füge ich das zu sys.path hinzu? Ich habe versucht, dies im selben Ordner wie mein Python-Skript hinzuzufügen, aber es hat nicht funktioniert
rilut
16

Obwohl dies nicht sofort hilft, gibt es eine Alternative, die sowohl mit Unix (fcntl) als auch mit Windows (win32-API-Aufrufe) funktioniert : portalocker

Es beschreibt sich selbst als plattformübergreifende (posix / nt) API für das Sperren von Flock-Dateien für Python. Grundsätzlich werden fcntl Win32-API-Aufrufen zugeordnet.

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

Joeri
quelle
1
fcntlmacht viel mehr als nur Dateien sperren.
cz