为何`from Package.Module_3 import SomeClass`导入语句无法正常工作?
Python包导入问题排查与解决
项目结构
Package\ |______ src\ |_______|___ __init__.py | |___ Module_1.py | |___ Module_2.py | | | |___ Module_3\ | |_________ __init__.py | |_________ Module_3.py | |_________ assets\ | |______ setup.py |______ __init__.py
问题描述
我尝试用以下语句从Module_3导入类:
from Package.Module_3 import SomeClass
却触发错误:
ModuleNotFoundError: No module named 'Package.Module_3'
当前Package/__init__.py的内容:
from .src import Module_1, Module_2, Module_3 from .src.Module_3 import Module_3
Package/src/__init__.py和Package/src/Module_3/__init__.py都是空文件。请问需要在某个__init__.py中添加额外导入语句来修复这个错误吗?
解决方案
你的问题核心是包的层级映射没做好:Package.Module_3这个路径并不存在——实际的Module_3包是在src目录下,真实路径为Package.src.Module_3。你可以通过两种方式修复:
方式一:直接使用真实路径导入(最简单)
直接根据实际层级写导入语句:
from Package.src.Module_3.Module_3 import SomeClass
如果想简化写法,可以在Package/src/Module_3/__init__.py里提前导出SomeClass:
# Package/src/Module_3/__init__.py from .Module_3 import SomeClass
之后就能用更简洁的写法:
from Package.src.Module_3 import SomeClass
方式二:通过根__init__.py重定向路径(实现你想要的Package.Module_3写法)
修改Package/__init__.py,把src下的Module_3直接挂载到根包的命名空间:
# Package/__init__.py from .src import Module_1, Module_2 # 将src下的Module_3包暴露为Package.Module_3 from .src import Module_3 # 同时把Module_3.py里的SomeClass也导进根命名空间 from .src.Module_3.Module_3 import SomeClass # 关键一步:让Python识别Package.Module_3这个路径 import sys sys.modules['Package.Module_3'] = Module_3
这样就能直接用from Package.Module_3 import SomeClass完成导入了。
补充说明
- 空的
__init__.py仅用于标识这是一个Python包,不会自动导出子模块的内容,所以需要显式导入你想对外暴露的类或模块。 - 如果你的项目是可安装包,建议在
setup.py中用find_packages()自动声明包结构,避免手动维护导入语句:
# setup.py from setuptools import setup, find_packages setup( name="Package", packages=find_packages(), )
内容的提问来源于stack exchange,提问作者Andres_alfp
相关产品推荐
相关产品推荐

