如何在Python循环中使用变量实现批量from ... import *式导入?
实现批量导入
vars*文件变量并直接使用的方案 我完全懂你的痛点——不用每次手动修改导入语句,自动遍历所有vars前缀的文件,还能像from ... import *那样直接调用变量,不用加模块前缀,省得大面积改动现有代码对吧?
问题出在import是Python的静态语法,没法直接在from语句里用变量替代模块名。不过我们可以通过动态导入+修改全局命名空间的方式,完美模拟from ... import *的效果,具体实现如下:
核心思路
- 用
glob定位当前目录下所有符合vars*.py格式的文件 - 将文件路径转换为合法的模块名(去掉路径前缀和
.py后缀) - 用
importlib动态导入目标模块 - 把模块中所有非下划线开头的变量(这正是
from ... import *的默认导入规则)注入到当前全局命名空间
完整代码示例
import glob import importlib import os # 定位当前目录下所有vars开头的py文件 var_file_paths = glob.glob("./vars*.py") for file_path in var_file_paths: # 将文件路径转换为模块名:比如"./vars1.py" → "vars1" module_name = os.path.basename(file_path).rstrip(".py") # 动态导入模块 module = importlib.import_module(module_name) # 模拟from ... import *:把模块内非下划线开头的变量加入当前全局命名空间 for attr_name in dir(module): if not attr_name.startswith("_"): globals()[attr_name] = getattr(module, attr_name) # 这里直接写你的业务代码即可,和手动写from varsX import *后的代码完全兼容 # 比如原来的代码写了print(volume),现在不用改成module.volume,直接保留就行 # -------------------------- # 示例:打印当前导入的变量(可根据需求替换成你的业务逻辑) print(f"从{module_name}导入的变量:{[k for k in globals() if not k.startswith('_') and k not in ['module', 'attr_name']]}") # --------------------------
关键细节说明
- 模块名处理:通过
os.path.basename去掉路径前缀,rstrip(".py")去掉文件后缀,确保得到Python能识别的合法模块名 - 变量过滤规则:只导入非下划线开头的变量,和
from ... import *的默认行为完全一致(下划线开头的变量被视为私有,不会被*导入) - 同名变量覆盖:如果多个
vars文件存在同名变量,后导入的会覆盖先导入的,这和手动多次执行from ... import *的效果一致,需要注意避免变量名冲突
这样修改后,你原来的业务代码完全不需要调整,直接放在循环内就能批量处理所有vars前缀的文件啦。
内容的提问来源于stack exchange,提问作者Ros
相关产品推荐
相关产品推荐

