Python跨文件导入全局变量遇异常:获取失败或误执行模块代码
问题解决:Python跨文件导入全局变量的两个问题
问题1:导入后访问全局变量报错 AttributeError
你遇到的报错是因为repository_id这个全局变量只有在调用create_repository函数后才会被赋值,如果没调用函数,模块create_repo里根本不存在这个属性,自然会触发报错。
问题2:移出__name__ == "__main__"导致重复创建仓库
Python导入模块时会执行模块内所有顶级代码(不在函数或if __name__块里的代码),所以把函数调用移出该判断后,只要导入模块就会执行创建仓库的逻辑,导致重复创建。
解决方案
方案1:用函数返回值替代全局变量(推荐)
全局变量容易引发代码耦合和不可预测的问题,更规范的做法是让函数直接返回repository_id,按需调用获取:
修改create_repo.py:
import json import requests from requests.auth import HTTPBasicAuth import sys # 请确保这些全局变量已正确定义 personal_access_token = "你的令牌" base_url = "API接口地址" def create_repository(repository_name): headers = { 'Authorization': 'Basic ' + personal_access_token, # 注意Basic后加空格,否则认证会失败 'Content-Type': 'application/json', 'User-Agent': 'Chrome' } payload = json.dumps({ "project": "xxxxx", "name": repository_name }) response = requests.request( "POST", base_url, headers=headers, data=payload, auth=HTTPBasicAuth("yyyy", personal_access_token) ) print(response.text) repository_id = response.text[6:44] print("ID of the new repository:", repository_id) return repository_id # 返回仓库ID if __name__ == "__main__": # 只有直接运行该脚本时才会执行创建逻辑 create_repository(sys.argv[1])
在其他文件中使用:
import create_repo # 按需调用函数创建仓库并获取ID(不会重复创建,除非你主动调用) repo_id = create_repo.create_repository("你的仓库名") print(repo_id)
方案2:初始化全局变量(兼容原有逻辑)
如果必须保留全局变量的方式,在create_repo.py开头初始化repository_id为None,这样即使没调用函数,导入后访问也不会报错:
修改create_repo.py:
import json import requests from requests.auth import HTTPBasicAuth import sys personal_access_token = "你的令牌" base_url = "API接口地址" repository_id = None # 提前初始化全局变量 def create_repository(repository_name): global repository_id # 声明使用全局变量 headers = { 'Authorization': 'Basic ' + personal_access_token, 'Content-Type': 'application/json', 'User-Agent': 'Chrome' } payload = json.dumps({ "project": "xxxxx", "name": repository_name }) response = requests.request( "POST", base_url, headers=headers, data=payload, auth=HTTPBasicAuth("yyyy", personal_access_token) ) print(response.text) repository_id = response.text[6:44] print("ID of the new repository:", repository_id) if __name__ == "__main__": create_repository(sys.argv[1])
在其他文件中使用:
import create_repo # 先调用函数创建仓库,才能获取到有效的ID create_repo.create_repository("你的仓库名") print(create_repo.repository_id)
内容的提问来源于stack exchange,提问作者Klára Janstová
相关产品推荐
相关产品推荐

