如何在Python中转发子模块导入?优化嵌套包导入路径
解决方案
修改外层package_b/__init__.py
要实现无需手动编写子包内容名称的自动映射,替换外层package_b/__init__.py的内容为以下代码:
import importlib import os # 定位内层同名子包的目录 inner_package_path = os.path.join(os.path.dirname(__file__), "package_b") # 遍历内层子包下的所有模块文件 for file_name in os.listdir(inner_package_path): if file_name.endswith(".py") and file_name != "__init__.py": # 提取模块名(去掉.py后缀) module_name = file_name[:-3] # 动态导入内层模块 imported_module = importlib.import_module(f".package_b.{module_name}", __name__) # 将模块挂载到外层包的命名空间 globals()[module_name] = imported_module
为什么之前的from .package_b import *无效?
from .package_b import *只会导入内层package_b/__init__.py中显式暴露的名称,但内层__init__.py默认是空的,所以不会把some_file_b.py这类模块导入到外层包的命名空间里,自然无法直接用package_b.some_file_b的方式引用。
效果验证
修改完成后,在some_file_a.py中直接使用目标导入语句即可:
from package_b.some_file_b import stuff
后续内层子包新增模块时,这段代码会自动识别并导入,不需要再次修改外层__init__.py。
内容的提问来源于stack exchange,提问作者theberzi
相关产品推荐
相关产品推荐

