如何通过变量存储的路径动态导入Python文件中的变量?
如何通过变量中的文件名导入Python模块?
我正在开发一个辅助Pygame项目构建矩阵的工具——用Tkinter做设置窗口,通过Pygame给tiles上色来赋予0-9的数值。我需要把项目保存为自定义命名的文件,之后能重新打开读取其中的变量值。创建保存文件没问题,但加载时遇到了麻烦:
- 我用Tkinter文件对话框获取文件路径,再通过os模块提取文件名存到变量里
- 但当文件名是变量时,没法导入文件里的内容
简化示例(file2.py仅包含var = 1):
second_file = "file2.py" from second_file import * print(var)
运行报错:ModuleNotFoundError: No module named 'second_file'
想问有没有办法修改代码,让Python识别变量里的文件名?
解决方案
方法1:使用importlib动态导入
这是Python官方推荐的动态导入方式,能完美处理文件名存于变量的场景:
import importlib.util import os second_file = "file2.py" # 提取模块名(去掉.py后缀)和绝对路径 module_name = os.path.splitext(os.path.basename(second_file))[0] file_path = os.path.abspath(second_file) # 加载并执行模块 spec = importlib.util.spec_from_file_location(module_name, file_path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) # 直接通过模块对象访问变量 print(module.var)
方法2:直接读取文件并执行(适合简单场景)
如果你的保存文件只是纯变量赋值的简单内容,可以直接读取文件代码并执行,将变量加载到当前命名空间:
second_file = "file2.py" # 读取文件内容 with open(second_file, 'r', encoding='utf-8') as f: code_content = f.read() # 执行代码,变量会被注入当前环境 exec(code_content) print(var)
注意:此方式仅适用于你自己生成的信任文件,绝对不要用来执行未知来源的代码,存在安全风险。
额外优化建议
用.py文件存储配置并非最优选择,推荐使用更适合存储数据的格式:
- JSON:适合结构化数据,读写简单,完全避免模块导入问题
- Pickle:可直接序列化Python对象,但仅适用于信任文件
- ConfigParser:适合键值对形式的配置文件
以JSON为例的示例代码:
保存时:
import json # 存储矩阵和变量数据 project_data = {"var": 1, "matrix": [[0,1],[2,3]]} with open("matrix_config.json", 'w', encoding='utf-8') as f: json.dump(project_data, f, indent=2)
加载时:
import json with open("matrix_config.json", 'r', encoding='utf-8') as f: project_data = json.load(f) print(project_data["var"]) print(project_data["matrix"])
内容的提问来源于stack exchange,提问作者Jordan Beauchamp
相关产品推荐
相关产品推荐

