2009-09-14 14 views
53

Recibí un proyecto de Python (que pasa a ser un proyecto de Django, si eso importa) que usa el módulo fcntl de la biblioteca estándar, que parece estar disponible solo en Linux. Cuando intento ejecutarlo en mi máquina con Windows, se detiene con un ImportError, porque este módulo no existe aquí.fcntl substitute en Windows

¿Hay alguna forma de hacer un pequeño cambio en el programa para que funcione en Windows?

+1

¿Qué trata específicamente de hacer el código con fcntl? fcntl() hace muchas cosas diferentes. –

Respuesta

60

El sustituto de fcntl en Windows es win32api llamadas. El uso es completamente diferente. No se trata de un cambio que puedes simplemente voltear.

En otras palabras, portar un módulo fcntl -heavy-user a windows no es trivial. Requiere que analice exactamente qué hace cada llamada fcntl y luego busque el código equivalente win32api, si corresponde.

También existe la posibilidad de que algunos códigos que usan fcntl no tengan ventanas equivalentes, lo que requeriría cambiar la API del módulo y tal vez la estructura/paradigma del programa utilizando el módulo que está portando.

Si proporciona más detalles sobre las llamadas fcntl, las personas pueden encontrar equivalentes de Windows.

16

Aunque esto no le ayuda de inmediato, hay una alternativa que puede funcionar tanto con Unix (fcntl) y Windows (llamadas API Win32), llamado: portalocker

Se describe como una cruzada API de plataforma (posix/nt) para el bloqueo de archivos estilo flock para Python. Básicamente asigna fcntl a win32 api llamadas.

El código original en http://code.activestate.com/recipes/65203/ ahora se puede instalar como un paquete separado - https://pypi.python.org/pypi/portalocker

28

El módulo fcntl sólo se utiliza para bloquear el archivo de fijación, por lo que suponiendo que no intenta de acceso múltiple, esto puede ser una aceptable solución alternativa Coloque este módulo en su PYTHONPATH, y debería funcionar como el módulo fcntl oficial.

Intente utilizar this module para fines de desarrollo/prueba solo en 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

Esto es un hack; pero es lo que necesitaba :) –

+0

Se agregaron constantes numéricas. –

+1

¿Qué tal fcntl.F_GETFD y fcntl.F_SETFD – JimSEOW