如何让函数仅在程序首次启动时执行?
问题分析与修复方案
你的代码有几个关键问题导致“仅首次启动执行函数”的功能失效:
- 内存变量无法持久化:你用的
onn是内存变量,程序重启后会直接重置为0,根本没法记录是否已经启动过。 - 变量作用域错误:函数里直接给
onn赋值时,Python会把它当成局部变量,而你引用的是未定义的局部变量,运行时会直接报错。 - 文件检查逻辑错误:
if contents == str是把文件内容和类型做比较,完全不符合逻辑,这个条件永远不会成立。 - 每次启动都强制执行函数:你不管是不是首次启动,都会直接调用
first_time_open_only(),等于每次启动都会覆盖文件内容。
正确实现思路
要实现“仅首次启动执行函数”,核心是用持久化存储(比如文件)记录状态,而不是依赖内存变量。流程应该是:
- 启动时先检查标记文件是否存在,或者文件里是否有有效内容
- 如果不存在/无内容,执行首次启动的函数,并写入标记
- 如果已经存在,跳过首次函数,直接执行后续验证逻辑
修复后的代码
import _winreg import os # 获取MachineGuid key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Cryptography") result = _winreg.QueryValueEx(key, "MachineGuid") ID = str(result) _winreg.CloseKey(key) licence_path = r'C:\Program Files\Common Files\System\read.txt' def first_time_open_only(): # 写入MachineGuid到文件 with open(licence_path, 'w') as file: file.write(ID[2:38]) # 检查文件是否存在,判断是否首次启动 if not os.path.exists(licence_path): first_time_open_only() else: # 非首次启动,验证文件内容 with open(licence_path) as f: contents = f.read().strip() # 内容无效则关闭程序 if not contents or contents != ID[2:38]: root.destroy()
关键修改点
- 用
os.path.exists()检查文件是否存在,以此判断是否为首次启动 - 使用
with语句自动管理文件,避免手动关闭文件的潜在错误 - 修正文件内容验证逻辑,直接对比实际的MachineGuid片段
- 去掉了没用的
onn变量,改用文件作为持久化标记
内容的提问来源于stack exchange,提问作者nothing
相关产品推荐
相关产品推荐

