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

同一模块内文件导入正常,外部main.py调用时触发ModuleNotFoundError

解决模块导入路径问题:运行main.py时找不到a模块

问题场景

目录结构:

├── main.py
└── my_module
    ├── a.py
    ├── b.py
    └── __init__.py

a.py代码:

def f():
    print('Hello World.')

b.py原代码:

from a import f

def f2():
    f()

if __name__ == '__main__':
    f2()

main.py代码:

from my_module.b import f2

if __name__ == '__main__':
    f2()

直接运行b.py能正常打印Hello World.,但运行main.py时抛出错误:

Traceback (most recent call last):
  File "/home/user/main.py", line 1, in <module>
    from my_module.b import f2
  File "/home/user/my_module/b.py", line 1, in <module>
    from a import f
ModuleNotFoundError: No module named 'a'

原因分析

直接运行b.py时,Python会把当前脚本所在的my_module目录加入模块搜索路径sys.path,因此能找到同目录的a.py。但从main.py导入my_module.b时,sys.path的顶级目录是main.py所在的根目录,此时a不是可识别的顶级模块,所以会触发找不到模块的错误。

解决方案

方案1:使用相对导入

修改b.py的导入语句,用相对路径引用同目录的a模块:

from .a import f

def f2():
    f()

if __name__ == '__main__':
    f2()

如果需要兼顾直接运行b.py的场景,可以做兼容处理:

try:
    # 作为包的一部分被导入时使用相对导入
    from .a import f
except ImportError:
    # 直接运行脚本时使用同级导入
    from a import f

def f2():
    f()

if __name__ == '__main__':
    f2()

方案2:使用绝对导入

基于项目根目录的绝对路径导入a模块,修改b.py:

from my_module.a import f

def f2():
    f()

if __name__ == '__main__':
    f2()

若要兼容直接运行b.py的情况,需要手动将项目根目录加入sys.path:

import sys
from pathlib import Path

# 将项目根目录(main.py所在目录)添加到模块搜索路径
sys.path.append(str(Path(__file__).parent.parent))

from my_module.a import f

def f2():
    f()

if __name__ == '__main__':
    f2()

内容的提问来源于stack exchange,提问作者Keredu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:52:08