You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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变量,这种写法本身就会带来变量作用域的耦合问题,很容易出现找不到变量的错误。
修复方案
  1. 调整代码位置:把resource_path、find_regex_1、read_configs三个工具函数的定义从like事件分支中移到gui模块的顶层,保证模块被导入时这些函数已经完成定义。
  2. 调整初始化逻辑:如果你需要不管是直接运行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'))
  1. 优化函数耦合(可选,推荐):把需要的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 08:36:03