Python如何动态加载子模块,解决source.Amazon无Run属性报错
问题原因及解决方案
错误根因
- 导入层级不匹配:你当前导入的是
source.Amazon包本身,但Run()方法定义在source.Amazon.clean子模块中,包默认不会自动挂载子模块的方法。 __init__.py配置不符合预期:你设置的__all__ = ["clean"]仅控制from source.Amazon import *语句的导入范围,不会自动将子模块方法暴露到包层级。- 大小写存在不统一风险:目录名是首字母大写的
Source,导入语句写的是小写source,Windows系统不区分大小写不会报错,但Linux/macOS环境会直接出现模块找不到的问题,建议统一将目录改为全小写source。
修复方案(二选一即可)
方案1:直接导入对应子模块(无需修改__init__.py)
修改src/clean.py中的模块导入语句,直接导入对应厂商下的clean模块:
import importlib import sys from pathlib import Path # 确保项目根目录加入模块搜索路径,避免找不到source模块 sys.path.append(str(Path(__file__).parent.parent)) Vendors = ["Amazon","Google"] def Run(Config): results = "" for vendor in Vendors: # 直接导入vendor下的clean子模块 mod = importlib.import_module(f"source.{vendor}.clean") results += mod.Run() return results
方案2:修改厂商包的__init__.py,暴露方法到包层级
保留你原有src/clean.py的代码不动,修改每个厂商目录下的__init__.py,将Run方法导入到包层级:
__all__ = ["clean"] from .clean import Run
修改完成后,source.Amazon包本身就会带有Run属性,原有调用逻辑可以正常运行。
内容的提问来源于stack exchange,提问作者Bill Software Engineer
相关产品推荐
相关产品推荐

