Python私有包相对导入重导出后无法按模块路径导入类的问题
你当前在package/__init__.py中执行的from .src.core import types,只是把package.src.core.types模块对象导入到了package包的命名空间里,但这并没有在文件系统中创建package/types.py或package/types/子模块目录。Python的模块导入默认基于文件结构查找,所以from package.types import Foo会尝试寻找不存在的package.types子模块,最终触发ModuleNotFoundError。
以下几种方案都无需将包发布到公共/私有索引,适配你当前的git submodules部署方式:
方案1:手动注册模块别名(无需修改包结构)
在package/__init__.py中添加模块注册表修改逻辑,让Python将package.types指向已有的package.src.core.types模块:
import sys from .src.core import types from .src.core import interfaces # 注册模块别名,让package.types指向src.core下的对应模块 sys.modules['package.types'] = types sys.modules['package.interfaces'] = interfaces
修改后即可直接使用from package.types import Foo的导入方式。
方案2:添加顶层子模块文件(符合Python模块规范)
在package目录下新建两个文件:types.py和interfaces.py,分别写入以下内容:package/types.py:
# 从核心模块导出所有内容 from .src.core.types import *
package/interfaces.py:
from .src.core.interfaces import *
这种方式通过创建真实的顶层子模块文件,完全符合Python的模块查找逻辑,from package.types import Foo会直接读取package/types.py,进而导入核心模块的内容。
方案3:保留现有导入方式(无需修改代码)
如果不想调整包结构或修改__init__.py,继续使用当前可行的导入方式即可:
from package import types def foo(param: types.Foo): ...
内容的提问来源于stack exchange,提问作者Pollastre

