Python自定义包导入报ModuleNotFoundError,神经网络开发求助
解决Python包导入问题:ModuleNotFoundError与包/模块识别问题
问题回顾
你的项目结构如下(修正拼写:scrips应为scripts):
project_root/ ├── activations/ │ ├── __init__.py │ └── Activations.py ├── losses/ │ ├── __init__.py │ └── Losses.py ├── optimizers/ │ ├── __init__.py │ └── Optimizers.py └── scripts/ └── proffs.py
核心问题:
- 在
scripts目录内运行proffs.py时,执行import activations.Activations报错ModuleNotFoundError: No module named 'activations' - 在项目根目录运行时,Python能识别
activations但你认为它被当作模块而非包
原因分析
- 模块搜索路径问题:当在
scripts目录内运行脚本时,Python的默认搜索路径不包含项目根目录,因此找不到上层的activations包。 - 包的标识与导入方式:
activations是包(因为包含__init__.py),但如果__init__.py为空且导入方式不当,可能会让你误以为它被当作模块。
解决方案
1. 配置包的__init__.py(优化导入体验)
在每个包的__init__.py中导出需要的类/函数,让包的接口更清晰。例如在activations/__init__.py中添加:
# 导入Activations模块中的所有内容,或者指定具体类/函数 from .Activations import *
这样后续导入时可以直接用from activations import Sigmoid, ReLU(假设你的Activations模块里有这些类),无需写全路径。
2. 针对不同运行场景的导入方案
场景一:在项目根目录运行proffs.py
直接使用绝对导入即可,Python会自动将当前工作目录(项目根)加入搜索路径:
# 方式1:导入整个模块 import activations.Activations # 使用时:activations.Activations.你的类/函数 # 方式2:从包导入模块 from activations import Activations # 使用时:Activations.你的类/函数 # 方式3:直接导入具体类(需先配置__init__.py) from activations import ReLU
此时activations是包,你可以通过.访问其内部模块或导出的成员,并非被当作普通模块。
场景二:在scripts目录内运行proffs.py
需要手动将项目根目录添加到Python的搜索路径中,在proffs.py开头添加:
import sys from pathlib import Path # 获取项目根目录(scripts的父目录) project_root = Path(__file__).parent.parent # 将根目录加入搜索路径 sys.path.append(str(project_root)) # 之后就可以正常导入了 from activations import Activations
3. 遵循PEP8命名规范(可选但推荐)
- 模块名建议使用小写,例如将
Activations.py改为activations.py,避免与包名混淆 - 类名使用大驼峰,函数/变量名使用小写加下划线,让代码风格更统一
内容的提问来源于stack exchange,提问作者Brayan 235
相关产品推荐
相关产品推荐

