我需要锁定一个文件以使用 Python 进行写入。它将同时被多个 Python 进程访问。我在网上找到了一些解决方案,但大多数都无法满足我的目的,因为它们通常仅基于 Unix 或 Windows。
要锁定一个文件以便用 Python 编写,并使其可同时从多个 Python 进程访问,您可以fcntl在基于 Unix 的系统上使用模块,msvcrt在win32fileWindows 上使用模块。以下是使用适用于不同平台的文件锁定技术的通用方法:
fcntl
msvcrt
win32file
基于 Unix 的系统(Linux、macOS 等):
您可以使用fcntl模块在文件上创建咨询锁。此锁将阻止其他进程在您的进程拥有锁时修改文件。
``` import fcntl import os
def lock_file(file): fd = os.open(file, os.O_RDWR) try: fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) return fd except IOError: # Failed to acquire lock os.close(fd) return None
def unlock_file(fd): if fd is not None: fcntl.flock(fd, fcntl.LOCK_UN) os.close(fd)
# Example usage: file_path = ‘example.txt’ fd = lock_file(file_path) if fd: try: # Do your file writing operations here with open(file_path, ‘a’) as f: f.write(“Data to write\n”) finally: unlock_file(fd) ```
Unix 的解释:
fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
LOCK_EX
fd
LOCK_NB
IOError
fcntl.LOCK_UN
视窗:
在 Windows 上,文件锁定通常使用msvcrt或win32file模块来处理。以下是使用的基本示例msvcrt:
``` import msvcrt import os
def lock_file(file): fd = os.open(file, os.O_RDWR | os.O_CREAT) try: msvcrt.locking(fd, msvcrt.LK_NBLCK, 0) return fd except IOError: # Failed to acquire lock os.close(fd) return None
def unlock_file(fd): if fd is not None: os.close(fd)
msvcrt.locking(fd, msvcrt.LK_NBLCK, 0)
msvcrt.LK_NBLCK
通过使用这些技术,您可以有效地管理跨不同操作系统的 Python 文件锁定,确保多个进程安全地并发访问共享文件。