Die anderen Lösungen zitieren viele externe Codebasen. Wenn Sie es lieber selbst tun möchten, finden Sie hier einen Code für eine plattformübergreifende Lösung, die die entsprechenden Tools zum Sperren von Dateien auf Linux / DOS-Systemen verwendet.
try:
# Posix based file locking (Linux, Ubuntu, MacOS, etc.)
import fcntl, os
def lock_file(f):
fcntl.lockf(f, fcntl.LOCK_EX)
def unlock_file(f):
fcntl.lockf(f, fcntl.LOCK_UN)
except ModuleNotFoundError:
# Windows file locking
import msvcrt, os
def file_size(f):
return os.path.getsize( os.path.realpath(f.name) )
def lock_file(f):
msvcrt.locking(f.fileno(), msvcrt.LK_RLCK, file_size(f))
def unlock_file(f):
msvcrt.locking(f.fileno(), msvcrt.LK_UNLCK, file_size(f))
# Class for ensuring that all file operations are atomic, treat
# initialization like a standard call to 'open' that happens to be atomic.
# This file opener *must* be used in a "with" block.
class AtomicOpen:
# Open the file with arguments provided by user. Then acquire
# a lock on that file object (WARNING: Advisory locking).
def __init__(self, path, *args, **kwargs):
# Open the file and acquire a lock on the file before operating
self.file = open(path,*args, **kwargs)
# Lock the opened file
lock_file(self.file)
# Return the opened file object (knowing a lock has been obtained).
def __enter__(self, *args, **kwargs): return self.file
# Unlock the file and close the file object.
def __exit__(self, exc_type=None, exc_value=None, traceback=None):
# Flush to make sure all buffered contents are written to file.
self.file.flush()
os.fsync(self.file.fileno())
# Release the lock on the file.
unlock_file(self.file)
self.file.close()
# Handle exceptions that may have come up during execution, by
# default any exceptions are raised to the user.
if (exc_type != None): return False
else: return True
Nun AtomicOpen
kann in einen verwendet werden , with
Block , in dem man normalerweise eine Verwendung open
Aussage.
WARNUNG: Wenn die Ausführung unter Windows und Python vor dem Aufruf von exit abstürzt , bin ich mir nicht sicher, wie das Sperrverhalten aussehen würde.
WARNUNG: Die hier bereitgestellte Verriegelung ist nicht absolut, sondern nur eine Empfehlung. Alle potenziell konkurrierenden Prozesse müssen die Klasse "AtomicOpen" verwenden.