同一模块内文件导入正常,外部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
相关产品推荐
相关产品推荐

