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

Python运行脚本时出现ModuleNotFoundError: No module named 'exception'错误求助

Python运行脚本时出现ModuleNotFoundError: No module named 'exception'错误求助

看起来你遇到了Python模块导入的经典问题——直接运行子目录下的脚本时,Python解释器的路径上下文不对,导致找不到上层目录里的模块。我来帮你一步步解决这个问题:

问题原因分析

你的项目结构是这样的:

src/
├── __init__.py
├── exception.py
├── logger.py
└── components/
    ├── __init__.py
    └── data_ingestion.py

当你直接执行python src/components/data_ingestion.py时,Python会把src/components/当成当前工作的根目录,而不是src/。所以from src.exception import...这种写法会找不到模块,因为此时src不在Python的模块搜索路径(sys.path)里。

另外,你的exception.py里直接写了from logger import logging,这也是相对导入的问题,当exception.py被其他模块导入时,同样会找不到logger模块。

解决方案

这里有几种靠谱的解决方式,你可以根据自己的需求选择:

方式1:使用相对导入(适合作为包的一部分运行)

修改各个文件的导入语句为相对路径:

  • 修改exception.py里的导入:
    import sys
    from .logger import logging  # 用相对导入引用同目录下的logger模块
    
  • 修改data_ingestion.py里的导入:
    from ..exception import CustomException  # 向上一级目录引用exception
    from ..logger import logging  # 向上一级目录引用logger
    

然后不要直接运行data_ingestion.py,而是回到项目根目录(也就是src所在的目录),用包的方式运行:

python -m src.components.data_ingestion

这种方式会让Python把src识别为一个包,相对导入就能正常工作了。

方式2:把src目录添加到Python路径(适合直接运行脚本)

如果你还是想直接执行python src/components/data_ingestion.py,可以在data_ingestion.py的最开头添加代码,把src目录加入到Python的搜索路径中:

import sys
import os
# 获取当前脚本所在目录的上一级目录(也就是src目录)
src_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
if src_path not in sys.path:
    sys.path.append(src_path)

# 之后再导入模块
from exception import CustomException
from logger import logging

同时,记得把exception.py里的from logger import logging也改成from .logger import logging,或者同样添加路径处理(不过更推荐用相对导入)。

方式3:设置PYTHONPATH环境变量(全局生效)

在终端里,先把src所在的目录(项目根目录)添加到PYTHONPATH:

# Linux/macOS
export PYTHONPATH=/path/to/your/project/root:$PYTHONPATH

# Windows(cmd)
set PYTHONPATH=C:\path\to\your\project\root;%PYTHONPATH%

# Windows(PowerShell)
$env:PYTHONPATH = "C:\path\to\your\project\root;" + $env:PYTHONPATH

设置完之后,你再运行python src/components/data_ingestion.py,Python就能找到src下的模块了。这种方式适合经常在这个项目里开发的场景,不用每次改代码。

额外注意点

  • 你的__init__.py是空的没问题,Python只需要它来识别目录为包,不需要内容。
  • 测试的时候,建议先把exception.py里的if __name__=="__main__"代码注释掉,或者也改成相对导入,避免单独运行exception.py时也报错。

备注:内容来源于stack exchange,提问作者Big Loot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 09:40:28