Python windows文件锁 防止文件重复打开

admin Python评论4字数 1032阅读模式

很多EXE程序,可以重复打开,但有些服务端程序如果多开就会导致端口冲突等问题,那么要解决程序多开就要使用到wnidows文件锁,下面是示例代码:

# 文件锁,防止重复打开程序
import sys
import os
import tempfile
import atexit
import ctypes
import msvcrt  # Windows特有模块

def show_warning():
    """显示已运行警告弹窗"""
    ctypes.windll.user32.MessageBoxW(
        0,
        "应用中心补丁已运行,请不要重复启动!",
        "温馨提示",
        0x40 | 0x0  # MB_ICONINFORMATION | MB_OK
    )
def prevent_multiple_instances(app_name="MyApp"):
    """Windows专用文件锁"""
    lock_file = os.path.join(tempfile.gettempdir(), f"{app_name}.lock")

    try:
        # 尝试以独占模式打开文件
        lock_fd = os.open(lock_file, os.O_RDWR | os.O_CREAT)

        # 尝试获取文件锁
        try:
            msvcrt.locking(lock_fd, msvcrt.LK_NBLCK, 1)

            # 写入进程ID
            os.lseek(lock_fd, 0, os.SEEK_SET)
            os.write(lock_fd, str(os.getpid()).encode())

            # 注册清理函数
            def cleanup():
                try:
                    msvcrt.locking(lock_fd, msvcrt.LK_UNLCK, 1)
                    os.close(lock_fd)
                    os.unlink(lock_file)
                except:
                    pass

            atexit.register(cleanup)

            print("成功获取文件锁")
            return lock_fd

        except IOError:
            # 文件已被锁定
            os.close(lock_fd)
            print("程序已在运行中")
            show_warning()  # 添加弹窗提醒
            sys.exit(1)

    except Exception as e:
        print(f"错误: {e}")
        sys.exit(1)


if __name__ == "__main__":
    lock_handle = prevent_multiple_instances("main")
    print("程序正常启动")
    input("按回车键退出...")

以上代码测试真实可用.文章源自网吧系统维护-https://www.58pxe.com/12933.html 文章源自网吧系统维护-https://www.58pxe.com/12933.html

版权声明:文章图片资源来源于网络,如有侵权,请留言删除!!!
广告也精彩
admin
  • 本文由 发表于 2026年4月26日 21:47:17
  • 转载请务必保留本文链接:https://www.58pxe.com/12933.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: