PCM_Report/single_instance.py

45 lines
1.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import os
import sys
import tempfile
from pathlib import Path
class SingleInstance:
def __init__(self, app_name="PCM_Report"):
self.lockfile = Path(tempfile.gettempdir()) / f"{app_name}.lock"
self.fp = None
def __enter__(self):
try:
if self.lockfile.exists():
# 尝试读取PID检查进程是否还在运行
try:
pid = int(self.lockfile.read_text().strip())
# 检查进程是否存在
if sys.platform == "win32":
import ctypes
kernel32 = ctypes.windll.kernel32
PROCESS_QUERY_INFORMATION = 0x0400
handle = kernel32.OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
if handle:
kernel32.CloseHandle(handle)
return False # 进程存在,不允许启动
else:
os.kill(pid, 0) # Unix系统检查
return False
except (ValueError, ProcessLookupError, OSError):
# 进程不存在,删除旧锁文件
self.lockfile.unlink(missing_ok=True)
# 创建锁文件
self.lockfile.write_text(str(os.getpid()))
return True
except Exception:
return False
def __exit__(self, *args):
try:
if self.lockfile.exists():
self.lockfile.unlink()
except Exception:
pass