首次创建Python自定义库导入时出现ModuleNotFoundError,求问题排查方案
问题原因
- 包内导入语法错误:
library/__init__.py中写的from filename import myclass1, myclass2属于顶层模块导入语法,Python会直接在全局模块搜索路径中找名为filename的顶层模块,不会自动在__init__.py所在的当前包目录下查找。 - 模块搜索路径差异:PyCharm默认会将项目的源目录自动加入Python模块搜索路径,所以不会标红报错,但直接运行脚本时,Python解释器仅会将运行脚本所在的目录(即
src目录)加入搜索路径,无法定位到library目录下的filename.py作为顶层模块。 - 额外笔误:从报错栈可以看到你实际运行的
__init__.py中导入的是class1、class2,和你代码中定义的myclass1、myclass2类名不一致,路径问题解决后需要修正该笔误,否则会继续报错。
解决方法
方案1:使用相对导入(适配当前结构,改动最小)
直接修改library/__init__.py的导入语句,加前缀.表示从当前包目录查找模块:
from .filename import myclass1, myclass2
修改后直接运行test-app.py即可正常执行。
方案2:使用绝对导入(适合后续打包发布场景)
如果后续要将该库打包为pip包对外分发,可以使用绝对导入写法:
from library.filename import myclass1, myclass2
本地测试时需要确保src目录在Python的模块搜索路径中,两种配置方式:
- PyCharm中右键
src目录,选择Mark Directory as->Sources Root,运行时会自动配置搜索路径 - 手动在
test-app.py开头添加代码,将src目录加入搜索路径:
import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__)))
正式打包补充配置
如果要对外发布该SDK,需要在项目根目录新增pyproject.toml配置文件,指定源码目录为src,即可保证用户安装后导入路径和本地测试一致。
内容的提问来源于stack exchange,提问作者Derek1st
相关产品推荐
相关产品推荐

