2009-09-14 23 views
53

Otrzymałem projekt Python (który jest przypadkiem projektem Django, jeśli to ma znaczenie), który używa modułu fcntl ze standardowej biblioteki, która wydaje się dostępna tylko w systemie Linux. Kiedy próbuję uruchomić go na moim komputerze z systemem Windows, zatrzymuje się on pod numerem ImportError, ponieważ ten moduł tutaj nie istnieje.Zastąpienie fcntl na Windows

Czy jest jakiś sposób, aby wprowadzić niewielką zmianę w programie, aby działał w systemie Windows?

+1

Co dokładnie jest kod próbuje zrobić z fcntl? fcntl() robi wiele różnych rzeczy. –

Odpowiedz

60

Substytutem fcntl w oknach są wywołania win32api. Zastosowanie jest zupełnie inne. To nie jest jakaś zmiana, którą możesz po prostu przerzucić.

Innymi słowy, przeniesienie modułu fcntl do systemu Windows nie jest łatwe. Wymaga to przeanalizowania, co dokładnie wywołuje każde wywołanie fcntl, a następnie znalezienia równoważnego kodu, jeśli taki istnieje.

Istnieje również możliwość, że niektóre kody używające fcntl nie mają odpowiedników w oknach, co wymagałoby zmiany api modułu i być może struktury/paradygmatu programu przy użyciu modułu, który przenosisz.

Jeśli podasz więcej informacji na temat połączeń fcntl, ludzie mogą znaleźć odpowiedniki w systemie Windows.

16

Mimo to nie pomoże ci od razu, istnieje alternatywa, która może pracować zarówno z Unix (fcntl) i Windows (połączenia Win32 API), zwany: portalocker

Opisuje siebie jako transgranicznego API platformy (posix/nt) do blokowania plików w stylu Flocka dla Pythona. Zasadniczo mapuje fcntl na wywołania ap32 win32.

Oryginalny kod na http://code.activestate.com/recipes/65203/ może być teraz instalowany jako osobny pakiet - https://pypi.python.org/pypi/portalocker

28

Moduł fcntl jest właśnie używany do blokowania pliku przypinania, więc zakładając, że nie spróbować wielokrotnego dostępu, może to być dopuszczalne obejście. Umieść ten moduł w swojej PYTHONPATH i powinien on działać jako oficjalny moduł fcntl.

Spróbuj użyć this module do programowania/testowania tylko w oknach.

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

To jest taki hack; ale tego właśnie potrzebowałem. :) –

+0

Dodano stałe numeryczne. –

+1

Co powiecie na fcntl.F_GETFD i fcntl.F_SETFD – JimSEOW

Powiązane problemy