# coding: utf-8
import win32con
import win32file
import pywintypes
import winerror
import sys
class SingleInstanceGuardian:
def __init__(self, lock_file_path):
self._lock_file_path = lock_file_path
self._lock_file = None
def _acquire_lock(self):
try:
# 创建一个文件用于锁定
self._lock_file = win32file.CreateFile(
self._lock_file_path,
win32file.GENERIC_WRITE,
0,
None,
win32file.CREATE_ALWAYS,
win32file.FILE_ATTRIBUTE_NORMAL,
None
)
# 尝试获取文件锁
win32file.LockFileEx(self._lock_file, win32con.LOCKFILE_EXCLUSIVE_LOCK | win32con.LOCKFILE_FAIL_IMMEDIATELY, 0, -0x10000, pywintypes.OVERLAPPED())
return True
except pywintypes.error as e:
if e.winerror == winerror.ERROR_LOCK_VIOLATION:
return False
else:
raise
def _release_lock(self):
if self._lock_file:
win32file.UnlockFileEx(self._lock_file, 0, -0x10000, pywintypes.OVERLAPPED())
win32file.CloseHandle(self._lock_file)
def is_already_running(self):
return not self._acquire_lock()
def run_task(self):
if self.is_already_running():
print("Another instance is already running.")
sys.exit(1)
# 执行任务代码
# 任务完成后释放锁
self._release_lock()
# 使用示例
lock_file_path = r"D:\lock_file.lock"
guardian = SingleInstanceGuardian(lock_file_path)
guardian.run_task()
说明: 依赖于 pywin32 模块,安装 pip install pywin32