pip与pipenv的区别及pipenv安装allauth后报ModuleNotFoundError问题求解
问题根本原因
- 报错的核心原因是执行migrate命令时调用的Python解释器,和pipenv关联的项目虚拟环境解释器不匹配:
- 你通过
pipenv install allauth安装的包,确实已经写入了当前项目目录下的.venv虚拟环境的site-packages中,但如果执行python manage.py migrate时调用的是系统全局的Python解释器,全局环境没有安装allauth就会抛出模块不存在的错误 - 后续你用
pip install allauth恢复正常,本质是把allauth安装到了当前执行pip命令对应的Python环境中,虽然migrate可以运行,但此时这个包并没有被pipenv管理,Pipfile和Pipfile.lock中不会有对应的依赖记录
- 你通过
pip与pipenv的核心差异
- pip是Python官方的基础包管理工具,仅负责包的安装、卸载、版本查询等基础操作,不会自动处理虚拟环境,默认将包安装到当前处于激活状态的Python环境中
- pipenv是基于pip和virtualenv开发的上层依赖管理工具,核心是整合了「虚拟环境管理」和「依赖版本锁定」两大能力:
- 执行
pipenv install [包名]时,会自动将包安装到当前项目专属的虚拟环境中,同时自动更新Pipfile和Pipfile.lock文件,记录所有依赖的名称和版本,方便项目迁移时一键还原完全一致的依赖环境
- 执行
- 不需要对同一个依赖执行两次安装操作,只要保证运行项目相关命令时,使用的是pipenv对应的虚拟环境即可:
- 进入项目根目录后执行
pipenv shell激活虚拟环境,之后执行的所有python、pip、django-admin命令都会自动调用虚拟环境内的对应版本 - 也可以不用手动激活,直接使用
pipenv run python manage.py migrate格式的命令,直接调用虚拟环境内的Python执行对应操作
- 进入项目根目录后执行
现有环境修复方案
- 先执行
pip uninstall allauth删除全局环境中额外安装的allauth包,避免后续出现多版本冲突 - 进入项目根目录执行
pipenv shell激活虚拟环境,执行pip list确认allauth已在安装列表中,之后再运行Django相关命令就不会再出现模块找不到的报错
内容的提问来源于stack exchange,提问作者LuciusVH
相关产品推荐
相关产品推荐

