运行main.py导入gui模块报license_code未定义错误,单独运行gui.py无异常
问题原因
你遇到的报错和路径无关,这也是你添加项目根路径后问题没有解决的核心原因,问题本质是代码执行逻辑和变量作用域的问题:
- 首先是
if __name__ == '__main__'的执行逻辑限制:直接运行gui.py时,该文件的__name__属性值为__main__,分支内读取license文件、赋值license_code的代码会正常执行,变量可以被正常访问。但你通过main.py导入gui模块时,gui模块的__name__属性值为gui,不会触发该分支的代码执行,license_code变量从未被定义,自然会触发名称错误。 - 其次是代码执行顺序的问题:你把
find_regex_1、read_configs函数的定义,以及读取license赋值的逻辑都写在了event == 'like'的事件判断分支内,只有当用户点击对应按钮触发事件后这部分代码才会执行。但从错误栈可以看到,你在gui模块的顶层代码就直接调用了activate_license函数,此时事件循环还未启动,like事件的分支根本没有执行过,相关变量自然不存在。 - 额外的耦合问题:
activate_license函数内部直接引用全局作用域的license_code变量,这种写法本身就会带来变量作用域的耦合问题,很容易出现找不到变量的错误。
修复方案
- 调整代码位置:把
resource_path、find_regex_1、read_configs三个工具函数的定义从like事件分支中移到gui模块的顶层,保证模块被导入时这些函数已经完成定义。 - 调整初始化逻辑:如果你需要不管是直接运行gui还是导入gui都要读取license,就直接去掉
if __name__ == '__main__'的判断,让读取配置的代码在模块加载时就执行:
# 模块顶层直接定义工具函数 def find_regex_1(k, s): reg = f'{k}\s*=\s*(\S+)' return re.search(reg, s).group(1) def read_configs(config_file): with open(config_file, "r") as f: content = f.read() license_code = find_regex_1('LICENSE CODE', content) activation_code = find_regex_1('ACTIVATION CODE ', content) return license_code, activation_code # 模块加载时直接读取配置,保证license_code全局可用 license_code, activation_code = read_configs('license.txt')
如果出现找不到license.txt的问题,可以用你已经写好的resource_path函数拼接绝对路径:
license_code, activation_code = read_configs(resource_path('license.txt'))
- 优化函数耦合(可选,推荐):把需要的
license_code作为参数传入activate_license函数,消除全局变量依赖,降低代码耦合度:
# 修改函数定义,接收license_code作为参数 def activate_license(license_key, license_code): machine_fingerprint = hashlib.sha256(str(get_mac()).encode('utf-8')).hexdigest() validation = requests.post( "https://api.example-url.com", headers={ "Content-Type": "application/vnd.api+json", "Accept": "application/vnd.api+json" }, data=json.dumps({ "meta": { "key": license_code, "scope": { "fingerprint": machine_fingerprint } } }) ).json()
调用的时候主动传入读取到的license_code即可:
status, msg = activate_license(sys.argv[0], license_code)
内容的提问来源于stack exchange,提问作者CatChMeIfUCan
相关产品推荐
相关产品推荐

