You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何`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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 15:11:02