Python如何通过变量名导入指定包的所有对象到当前命名空间
解决方案
实现逻辑
from X import *的本质是把模块X中允许导出的对象批量写入当前作用域的全局变量字典,你可以手动实现这个逻辑:
- 用
importlib.import_module拿到模块对象 - 遍历模块的可导出属性:优先取模块的
__all__属性(如果模块定义了的话),否则取所有非下划线开头的属性 - 把这些属性和对应值写入当前全局变量字典
globals()
适配示例的代码
你可以把main.py的代码调整为如下内容:
import importlib from aux1 import var module = importlib.import_module(var) # 实现等价于 from var import * 的效果 if hasattr(module, '__all__'): # 模块定义了__all__的话,就导入__all__里指定的所有对象 export_names = module.__all__ else: # 没有定义__all__的话,导入所有非下划线开头的公开对象 export_names = [name for name in dir(module) if not name.startswith('_')] # 批量写入当前全局变量 globals().update({name: getattr(module, name) for name in export_names})
运行之后你就可以直接在main.py里访问a、b变量了。
注意事项
- 该写法仅适用于快速测试场景,正式环境不推荐使用,会导致命名空间污染
- 如果导入模块的属性和当前作用域变量重名,会直接覆盖原有变量的值,测试时请注意避免冲突
内容的提问来源于stack exchange,提问作者BioBroo
相关产品推荐
相关产品推荐

