pyenv+pipenv/pip环境下Python版本不匹配问题排查与咨询
问题解答:pyenv下pip快捷方式与pipenv不遵循版本设置
问题背景
存在两个问题:
- pipenv忽略pyenv的版本设置;
- pip快捷方式不遵循pyenv的版本设置,相关命令行输出如下:
iuri@tartaruga:~$ pyenv version 3.9.16 (set by /home/iuri/.pyenv/version) iuri@tartaruga:~$ pyenv local 3.10 iuri@tartaruga:~$ pyenv version 3.10.9 (set by /.python-version) iuri@tartaruga:~$ pyenv exec python -m pip --version pip 22.3.1 from /home/iuri/.local/lib/python3.10/site-packages/pip (python 3.10) iuri@tartaruga:~$ pip --version pip 22.3.1 from /home/iuri/.local/lib/python3.9/site-packages/pip (python 3.9) iuri@tartaruga:~$ pyenv versions system 3.9.14 3.9.16 * 3.10.9 (set by /.python-version) 3.11.1 iuri@tartaruga:~$ pyenv exec python -m pipenv install torch Creating a virtualenv for this project... Pipfile: Pipfile Using /home/iuri/.pyenv/versions/3.11.1/bin/python3 (3.11.1) to create virtualenv... ^C iuri@tartaruga:~$ python --version Python 3.10.9 iuri@tartaruga:~$ pyenv exec python --version Python 3.10.9 iuri@tartaruga:~$ pyenv exec python -m pip --version pip 22.3.1 from /home/iuri/.local/lib/python3.10/site-packages/pip (python 3.10) iuri@tartaruga:~$ python -m pip --version pip 22.3.1 from /home/iuri/.local/lib/python3.10/site-packages/pip (python 3.10) iuri@tartaruga:~$ pip --version pip 22.3.1 from /home/iuri/.local/lib/python3.9/site-packages/pip (python 3.9) iuri@tartaruga:~$ pip3 pip3 pip3.10 pip3.11 pip3.9 iuri@tartaruga:~$ pip3.10 --version pip 22.3.1 from /home/iuri/.local/lib/python3.9/site-packages/pip (python 3.9) iuri@tartaruga:~$ pyenv global 3.9.16
一、pip快捷方式不遵循pyenv版本的原因与解决
原因
直接调用pip/pip3.x时,系统优先加载了非pyenv管理的独立pip二进制文件,而非pyenv生成的shim脚本:
python -m pip能正确匹配当前pyenv版本,因为这是通过当前激活的Python解释器直接调用pip模块,完全受pyenv控制。- 但
pip/pip3.10指向3.9版本的pip,说明这些二进制文件是之前在pyenv未激活状态下(或用全局Python)安装的,被放在了~/.local/bin或/usr/bin这类PATH优先级高于pyenv shims的目录中,导致系统跳过pyenv的shim直接执行这些文件。
解决方法
- 调整PATH优先级
检查echo $PATH输出,确保$HOME/.pyenv/shims在$HOME/.local/bin和/usr/bin之前。如果不是,修改shell配置文件(~/.bashrc或~/.zshrc):echo 'export PATH="$HOME/.pyenv/shims:$PATH"' >> ~/.bashrc source ~/.bashrc - 重新生成pyenv shims
强制pyenv为所有已安装Python版本生成对应的pip shim:pyenv rehash - 清理冲突的pip二进制文件
若上述步骤无效,直接删除~/.local/bin下的pip相关文件:
之后用当前pyenv版本重新安装pip:rm ~/.local/bin/pip ~/.local/bin/pip3 ~/.local/bin/pip3.*
此时pip会被安装到当前pyenv版本的site-packages下,对应的shim会被pyenv管理。python -m pip install --upgrade pip
二、pipenv忽略pyenv版本设置的原因与解决
原因
你执行pyenv exec python -m pipenv时,pipenv却使用3.11.1版本,核心原因是pipenv本身安装在Python 3.11.1的环境中。pipenv启动时会优先使用自身所在的Python版本,而非当前pyenv激活的版本;另外,pipenv的版本检测逻辑可能会绕过pyenv shim,直接查找系统中的Python。
解决方法
- 在当前pyenv版本下重新安装pipenv
激活目标pyenv版本后,重新安装pipenv:
这样pipenv会被安装到当前3.10.9的用户site-packages下,调用时会遵循pyenv的版本设置。pyenv local 3.10.9 python -m pip install --user pipenv - 显式指定pipenv使用的Python版本
临时指定或强制项目使用当前pyenv版本:
或修改项目pipenv install --python $(pyenv which python)Pipfile的[requires]部分:python_version = "3.10"
内容的提问来源于stack exchange,提问作者Iuri Guilherme
相关产品推荐
相关产品推荐

