pip安装本地Python包后出现ModuleNotFoundError问题排查
问题根本原因
该报错由两处配置错误共同导致,pip安装提示成功不代表包可被Python正常识别:
setup.py放置位置错误setup.py被直接放在了dummyLibrary包的源码目录内部,而非项目根目录。执行可编辑安装时,pip会为当前执行pip install -e .的目录创建egg链接,将该目录加入Python的包搜索路径;但Python导入dummyLibrary时,会在搜索路径下寻找名为dummyLibrary、内含__init__.py的子目录,而被链接的目录本身就是存放__init__.py的位置,不存在下一级dummyLibrary子文件夹,自然无法找到对应模块。setup.py缺失必要的包声明配置
现有setup.py仅配置了包名和版本号,未添加packages参数告知打包工具需要安装的Python包路径。基于distutils打包时,如果不手动指定packages参数,工具不会自动扫描目录下的Python包,仅会为当前目录创建可编辑链接,不会处理实际的包导入逻辑。
pip的可编辑安装不会做完整的包结构校验,只要
setup.py脚本本身能正常执行完成就会提示安装成功,不会校验待导入的模块路径是否真实存在,这就是两次安装均显示成功但实际无法导入的原因。
修复步骤
按以下顺序调整即可解决问题:
- 调整目录结构,将
setup.py移动到项目根目录(与application、dummyLibrary两个文件夹同级),调整后结构如下:
. ├── application │ └── runner.py ├── dummyLibrary │ ├── helperFunctions.py │ └── __init__.py └── setup.py
- 修改
setup.py内容,添加packages参数,明确声明要安装的包:
#!/usr/bin/env python from distutils.core import setup setup( name='dummyLibrary', version='0.0.1', packages=['dummyLibrary'] )
- 修改
dummyLibrary/__init__.py(当前为空文件),将需要对外暴露的函数导入包命名空间,否则即使包导入成功,调用foo()/bar()时也会触发属性不存在的报错:
from .helperFunctions import foo, bar
- 先卸载之前错误安装的包版本,再在项目根目录(当前存放
setup.py的目录)重新执行可编辑安装:
pip3 uninstall dummyLibrary -y pip3 install -e .
操作完成后进入application目录执行python3 runner.py即可正常运行,不会再出现模块找不到的报错。
内容的提问来源于stack exchange,提问作者34432345f23452fg345f2345f
相关产品推荐
相关产品推荐

