RedHat系统virtualenv创建虚拟环境误用Python3.6版本问题咨询
核心原因
- 你创建虚拟环境时重复指定了解释器参数:
--python=/usr/local/bin/python3.7和-p python3同时传入时,后面的-p python3优先级更高,会直接调用PATH里排在最前面的系统Python3.6 - RHEL8 绝对不能卸载自带的Python3.6,系统dnf/yum包管理器、大量底层系统组件都强依赖这个版本,强行卸载会直接导致系统工具链瘫痪
- 加sudo执行virtualenv时,root用户的PATH默认优先读取
/usr/bin下的系统可执行文件,会覆盖你自定义安装的Python3.7的路径优先级 - 你之前用
update-alternatives --config python没生效,是因为系统默认python3命令的软链接根本没被纳入alternatives管理,你改python的指向不会影响python3的调用逻辑
解决方法
方法一:直接用Python3.7自带的venv创建(零配置,最稳妥)
不要用全局的virtualenv命令,也不要加sudo(虚拟环境存在当前用户目录完全不需要root权限),直接调用你安装的Python3.7解释器内置的venv模块,100%不会串版本:
# 先删掉之前创建错误的虚拟环境 rm -rf app_virtual # 用目标Python解释器直接创建虚拟环境 /usr/local/bin/python3.7 -m venv app_virtual # 激活环境 source app_virtual/bin/activate # 验证版本 python --version
如果一定要用virtualenv,只保留一个解释器参数即可,不要重复传-p:
rm -rf app_virtual virtualenv --python=/usr/local/bin/python3.7 app_virtual source app_virtual/bin/activate
方法二:正确配置update-alternatives设置Python3默认版本
之前的配置操作没生效是因为没给python3注册候选项,按以下命令重新配置即可:
# 注册两个Python3版本到alternatives管理,末尾数字是优先级,数字越大优先级越高 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1 sudo update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.7 2 # 执行选择命令,选对应Python3.7的编号回车即可 sudo update-alternatives --config python3 # 验证默认版本 python3 --version
注意:不要修改
/usr/bin/python的默认指向,RHEL8下该软链默认指向Python2,部分老系统脚本依赖这个配置,改动后可能导致系统工具运行异常。
方法三:给Python3.7安装独立的virtualenv
如果以上操作还是不生效,说明你当前用的virtualenv本身就是安装在Python3.6环境下的,默认绑定了3.6解释器,给Python3.7单独装一套virtualenv即可:
# 用Python3.7的pip安装对应版本的virtualenv /usr/local/bin/python3.7 -m pip install virtualenv # 调用Python3.7对应的virtualenv创建环境 /usr/local/bin/virtualenv --python=/usr/local/bin/python3.7 app_virtual source app_virtual/bin/activate
校验标准
激活虚拟环境后执行以下命令,输出符合预期就说明配置正确:
which python # 正常输出应为:<你的虚拟环境所在路径>/app_virtual/bin/python python --version # 正常输出应为:Python 3.7.4
内容的提问来源于stack exchange,提问作者rpjs
相关产品推荐
相关产品推荐

