Cómo realizar el locking de archivos en Windows sin instalar un nuevo paquete

He agregado código a un paquete de Python ( brian2 ) que coloca un locking exclusivo en un archivo para evitar una condición de carrera. Sin embargo, como este código incluye llamadas a fcntl , no funciona en Windows. ¿Hay alguna manera de que pueda colocar lockings exclusivos en archivos en Windows sin instalar un nuevo paquete, como pywin32 ? (No quiero agregar una dependencia a brian2 .)

Dado que msvcrt es parte de la biblioteca estándar, supongo que lo tiene. El módulo msvcrt (MicroSoft Visual C Run Time) solo implementa un pequeño número de rutinas disponibles en el MS RTL, sin embargo implementa el locking de archivos. Aquí hay un ejemplo:

 import msvcrt, os, sys REC_LIM = 20 pFilename = "rlock.dat" fh = open(pFilename, "w") for i in range(REC_LIM): # Here, construct data into "line" start_pos = fh.tell() # Get the current start position # Get the lock - possible blocking call msvcrt.locking(fh.fileno(), msvcrt.LK_RLCK, len(line)+1) fh.write(line) # Advance the current position end_pos = fh.tell() # Save the end position # Reset the current position before releasing the lock fh.seek(start_pos) msvcrt.locking(fh.fileno(), msvcrt.LK_UNLCK, len(line)+1) fh.seek(end_pos) # Go back to the end of the written record fh.close() 

El ejemplo que se muestra tiene una función similar a la de fcntl.flock() , sin embargo, el código es muy diferente. Sólo se admiten lockings exclusivos. A diferencia de fcntl.flock() no hay un argumento de inicio (o de dónde). La llamada de locking o deslocking solo funciona en la posición actual del archivo. Esto significa que para desbloquear la región correcta tenemos que mover la posición actual del archivo a donde estaba antes de leer o escribir. Habiendo desbloqueado, ahora tenemos que avanzar la posición del archivo nuevamente, de vuelta a donde estábamos después de la lectura o escritura, para que podamos continuar.

Si desbloqueamos una región para la que no tenemos locking, no obtenemos un error o excepción.