使用python -m pip install -e安装本地sumobot包报ModuleNotFoundError如何解决
问题原因
- 解释器版本不匹配:你执行安装时用的
python和运行测试脚本时用的python指向的不是同一个解释器,树莓派默认预装Python2、Python3两个版本,常出现pip将包安装到Python3的库目录,运行脚本时却调用了Python2的情况。可执行python -c "import sys; print(sys.executable)"和python -m pip --version对比路径确认是否匹配。 - 包结构不符合规范:
setup.py中声明packages=['sumobot']要求项目根目录下必须存在sumobot文件夹,且sumobot、sumobot/robot_hardware两级目录下都必须有__init__.py文件(可为空),否则setuptools无法识别为Python包。 - 脚本运行方式错误:如果你直接进入
tests目录执行python test_motor.py,Python不会自动将项目根目录加入导入搜索路径,也会导致找不到sumobot包。 - 可编辑安装记录失效:你当前
pip list显示的是本地源码路径,说明你用了-e可编辑模式安装,如果之后移动过源码目录,会导致安装的路径链接失效。
临时修复步骤
- 确认项目结构符合下述要求:
项目根目录/ ├── setup.py ├── sumobot/ │ ├── __init__.py │ └── robot_hardware/ │ ├── __init__.py │ └── motor.py └── tests/ └── test_motor.py
- 回到项目根目录,重新执行安装命令:
python -m pip install -e . --force-reinstall - 统一用模块模式运行脚本,不要直接执行单独的py文件:
python -m tests.test_motor
更优的项目实现方案
目前你用的distutils已经被Python官方弃用,推荐用现代打包规范管理项目:
- 废弃
setup.py,在项目根目录新建pyproject.toml作为打包配置文件,示例配置如下:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "sumobot" version = "0.1.0" description = "is a sumobot!" packages = ["sumobot"]
- 包内模块互相调用时优先用相对导入,比如
sumobot目录下的其他模块要导入motor,可以写from .robot_hardware.motor import RawMotor,不依赖包的全局安装路径,兼容性更强。 - 如果需要频繁修改调试代码,始终用
-e可编辑模式安装包,修改代码后不需要重新安装即可生效。
内容的提问来源于stack exchange,提问作者NickyEichen
相关产品推荐
相关产品推荐

