Archivo de locking para el acceso en Windows

Usando portalocker podemos bloquear un archivo para acceder de la siguiente manera:

 f=open("M99","r+") portalocker.lock(f,portalocker.LOCK_EX) 

El lock sobre el archivo puede ser eliminado usando

 f.close() #or portalocker.unlock(file) #needs `file` ie reference to file it locked ..pretty obvious too 

¿Se puede hacer lo mismo de otra manera en python donde?

  1. Podemos bloquear el archivo para acceder.

  2. Reinicie Python (por lo que ya no tendrá el objeto de archivo de Python original o el número de archivo).

  3. Desbloquea el archivo para acceder en el nuevo proceso.

No puedo guardar file object así que tampoco puedo usar pickle o algo así. ¿Hay alguna manera de usar la biblioteca estándar de Python o alguna llamada win32api ?
¿Alguna utilidad de Windows también hará … alguna línea de comando desde Windows?

Puede usar subproceso para abrir el archivo en el bloc de notas o excel:

 import subprocess, time subprocess.call('start excel.exe "\lockThisFile.txt\"', shell = True) time.sleep(10) # if you need the file locked before executing the next commands, you may need to sleep it for a few seconds 

o

 subprocess.call('notepad > lockThisFile.txt', shell = True) 

Como está escrito, necesita shell = True, de lo contrario, Windows le dará un error de syntax.

(subprocess.Popen () también funciona)

Luego puedes cerrar el proceso más tarde usando:

 subprocess.call('taskkill /f /im notepad.exe') # or excel.exe 

Otras opciones incluyen

-escriba algún código C ++ y llámelo desde python ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx )

-Llamar progtwigs de terceros con subprocess.call ():

FileLocker http://www.jensscheffler.de/filelocker ( https://superuser.com/questions/294826/how-to-purposefully-exclusively-lock-a-file )

Easy File Locker http://www.xoslab.com/efl.html y Dispatch (de win32com.client import Dispatch), aunque la última opción es la más compleja

Parece que desea bloquear el acceso a los recursos donde el locking persiste entre las invocaciones del progtwig . Necesitas una estrategia diferente para eso.

Crea un archivo de locking usando el modo de creación exclusivo; en Python 2, esto requiere el uso de la llamada os.open() (seguida de os.fdopen() para producir un objeto de archivo Python), en Python 3 puede usar el modo 'x' cuando usa el open() incorporado.

En Python 2:

 import os LOCKFILE = r'some\path\to\lockfile' class AlreadyLocked(Exception): pass def lock(): try: fd = os.open(LOCKFILE, os.O_WRONLY | os.O_CREAT | os.O_EXCL) except IOError: # file already exists raise AlreadyLocked() with os.fdopen(fd, 'w') as lockfile: # write the PID of the current process so you can debug # later if a lockfile can be deleted after a program crash lockfile.write(os.getpid()) def unlock(): os.remove(LOCKFILE) 

En Python 3 la función lock() sería:

 def lock(): try: with open(LOCKFILE, 'x') as lockfile: # write the PID of the current process so you can debug # later if a lockfile can be deleted after a program crash lockfile.write(os.getpid()) except IOError: # file already exists raise AlreadyLocked() 

Necesitas usar el modo de creación exclusivo para evitar las condiciones de carrera; en el modo de creación exclusivo, el archivo solo se puede crear si aún no existe, una condición verificada por el sistema operativo, en lugar de un paso separado en Python que abriría una ventana para que otro progtwig también cree el locking.

Ahora puede bloquear y desbloquear sin rastrear el descriptor de archivos. El archivo de locking ahora es un archivo de señal ; si está presente, algo ha reclamado un locking y eliminar el archivo significa que hay algo desbloqueado.

Esto significa que el acceso a los archivos o directorios que intenta proteger solo está protegido porque todo su código respeta este sistema de locking, no porque el sistema operativo esté aplicando lockings en esos archivos o directorios.

Todo esto significa que esto solo funciona si todo el acceso al recurso compartido es manejado por procesos que cooperan en esta estrategia. No se puede utilizar si otro proceso no respeta este esquema. En ese caso, su única opción es utilizar el locking a nivel del sistema operativo y debe mantener el proceso en ejecución durante toda la duración del locking.

existe un método en win32api para establecer los atributos de archivo si tiene una lectura de lo siguiente:
Python SetFileAttributes
Atributos del archivo MSDN

estos te dan el método python para establecer atributos de archivo:
win32api.SetFileAttributes (archivo, win32con.FILE_ATTRIBUTE_NORMAL) donde archivo es el nombre / ruta del archivo, y no un objeto de archivo y el segundo argumento es una máscara de atributo. Si desea establecer varios atributos a la vez, puede usar xor Para añadirlos:
win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_READONLY

y hay más constantes nombradas en la página de MSDN.

EDITAR: para el locking de archivos, también puede consultar el método win32file.LockFileEx

No he usado esto antes, por lo que puede tardar un poco en jugar, pero parece que necesito que le pases un objeto de archivo (no una ruta) y luego ciertas constantes para establecer los permisos de acceso, se puede encontrar más información sobre las constantes en MSDN