关于使用exec通过文件路径加载模块变量的技术疑问
你的思路没完全错,只是踩了教材的“坑”
先给你吃个定心丸:想用exec加载文件来处理配置覆盖的思路本身不是完全错误的,但你确实被那本教材的不完整展示给坑了。
关于
exec加载模块变量的正确姿势:其实直接用exec读取文件内容来执行是可行的,但不是直接传文件路径,而是要先读取文件内容再传入exec。举个简单的例子:# 初始化一个字典用来存配置变量 config_vars = {} # 读取配置文件内容并执行 with open('your_config_path.py', 'r', encoding='utf-8') as f: exec(f.read(), config_vars) # 现在config_vars里就包含文件中定义的所有全局变量了不过要提醒你:这种方式存在安全风险——如果配置文件被恶意篡改,可能会执行未知的危险代码,所以如果是生产环境,更推荐用更安全的配置格式(比如JSON、YAML)或者官方推荐的模块加载方式。
再说说你遇到的教材问题:这种只展示部分代码+运行结果,后续才补全剩余内容的做法确实很坑,尤其是你只针对性看相关章节没通读全书的情况下,很容易被误导。好在你已经发现了问题,还参考了Mad Physicist的回答,应该已经理清正确的方向了。
最后给个更规范的替代方案:如果你的核心需求是动态加载配置文件并覆盖数据,用Python标准库的
importlib来动态导入模块会更符合Python的设计规范,也更安全。示例代码如下:import importlib.util # 指定配置文件路径和模块名(模块名可以随便取) config_file_path = 'your_config_path.py' module_name = 'custom_config' # 创建模块规格并加载 spec = importlib.util.spec_from_file_location(module_name, config_file_path) config_module = importlib.util.module_from_spec(spec) spec.loader.exec_module(config_module) # 之后就可以通过config_module.变量名来访问配置了 print(config_module.DB_HOST)
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

