安装djangorestframework-simplejwt时报PyJWT版本冲突如何解决
排查步骤
- 校验pip与Python解释器一致性
分别执行pip -V和which python3,确认两者指向同一环境。多数冲突都是因为升级PyJWT用的是虚拟环境的pip,而运行Django时调用了系统全局的Python解释器,导致加载到系统路径下的旧版本PyJWT。 - 排查系统级遗留PyJWT包
执行sudo pip3 list | grep PyJWT检查全局pip安装的包,若输出1.7.1版本,执行sudo pip3 uninstall PyJWT删除全局旧版本。此前卸载的deb包python3-jwt和pip全局安装的PyJWT是两个独立的安装源,不会互相影响。 - 检查依赖锁定文件
查看项目根目录下的requirements.txt、poetry.lock、Pipfile等依赖配置文件,确认没有强制指定PyJWT==1.7.1的规则,避免部署时自动回退到旧版本。 - 定位PyJWT实际加载路径
在Django项目入口处加入如下代码,启动服务后查看输出的路径,确认加载的是哪个位置的包:
如果输出路径为import jwt print(jwt.__file__)/usr/lib/python3/dist-packages/jwt,说明仍然加载的是系统级旧包。
解决方案
- 推荐方案:使用独立虚拟环境部署
所有项目依赖都安装在独立虚拟环境中,完全隔离系统级包:- 进入项目目录执行
python3 -m venv venv创建虚拟环境 - 执行
source venv/bin/activate激活虚拟环境 - 执行
pip install djangorestframework-simplejwt重新安装依赖,会自动匹配符合要求的PyJWT 2.x版本 - 修改Django服务启动配置(如systemd、uWSGI配置),将Python解释器路径替换为虚拟环境内的路径,示例:
/home/your_user/project_dir/venv/bin/python
- 进入项目目录执行
- 临时兼容方案:强制覆盖系统级PyJWT
若不便使用虚拟环境,执行sudo pip3 install --upgrade PyJWT>=2,<3 --force-reinstall直接覆盖系统路径下的旧版本PyJWT。
内容的提问来源于stack exchange,提问作者djain
相关产品推荐
相关产品推荐

