Python虚拟环境PIP版本低于创建版本的原因、解决及Python2.7适配疑问
先给你把这个问题的来龙去脉说透,再给你无副作用的解决办法——毕竟Python 2.7已经停更挺久了,得适配它的特殊情况。
为什么会出现版本差异?
MacOS自带的Python 2.7是个非常老旧的版本(苹果为兼容旧软件一直保留着),对应的pip版本也极低。当你用virtualenv创建虚拟环境时,它的默认逻辑是直接复制系统基础Python环境里的pip到虚拟环境中,而不是自动下载最新版的pip。这就导致虚拟环境里的pip版本,和你后来全局升级过的pip版本不一致——毕竟全局升级的pip是针对系统Python的,但virtualenv创建时只认当时系统Python里的旧pip。
另外要注意:Python 2.7在2020年就停止了官方维护,pip的最后一个兼容版本是20.3.4,之后的pip版本都不再支持Python 2.7,所以你也没法升级到更高版本了。
无副作用的解决方案与避免方法
1. 修复现有虚拟环境的pip版本
如果你已经创建了虚拟环境,只需激活它并升级pip到兼容的最高版本即可——所有操作都在虚拟环境内部,完全不会影响系统全局的Python和pip:
- 激活虚拟环境:
source your_env_name/bin/activate - 升级pip到20.3.4:
pip install --upgrade pip==20.3.4 - 验证版本:
pip --version,此时应该显示20.3.4
2. 从根源避免问题(创建环境时直接搞定)
为了每次创建虚拟环境都不用手动升级,可以把步骤自动化,或者提前配置好全局环境:
方法一:用脚本自动化创建与升级
写一个简单的bash脚本(比如create_py27_env.sh),一键完成虚拟环境创建+pip升级:
#!/bin/bash # 用法:./create_py27_env.sh 你的环境名称 if [ -z "$1" ]; then echo "请指定虚拟环境名称,比如:./create_py27_env.sh my_py27_project" exit 1 fi env_name=$1 # 创建虚拟环境 virtualenv $env_name # 激活并升级pip source $env_name/bin/activate pip install --upgrade pip==20.3.4 echo "虚拟环境 $env_name 创建完成,pip已升级到20.3.4" deactivate
给脚本加执行权限:chmod +x create_py27_env.sh,之后运行./create_py27_env.sh my_env就能直接得到pip版本正常的虚拟环境。
方法二:先确保全局Python2.7的pip是最新兼容版
如果你希望virtualenv创建时直接复制最新的pip,可以先把系统Python2.7的pip升级到20.3.4(用--user参数避免修改系统自带文件,无副作用):
- 升级全局pip2.7:
pip2.7 install --user --upgrade pip==20.3.4 - 之后再创建虚拟环境:
virtualenv my_env,此时虚拟环境里的pip就是20.3.4版本了
关键注意事项
- 永远不要用
sudo去升级Python2.7的pip,否则可能破坏MacOS系统自带的依赖(很多系统工具还依赖自带的Python2.7)。 - 因为Python2.7已停更,不要尝试升级pip到20.3.4以上版本,否则会出现兼容性错误。
内容的提问来源于stack exchange,提问作者Brian Barcelona




