超旧版本Linux下的超旧Python3升级到较新版本(不破坏旧Python3环境可随时切回)
介绍
本文介绍为超旧版本Linux下的超旧Python3升级到较新版本,同时不破坏原本旧环境Python环境也可以随时切回。
本文的例子为CentOS7.6+Python3.6,升级到最新的Python3.10,pip会一起绑定无需担心pip环境错乱,本文升级的原因为旧版本Python3.6编译时OpenSSL库为1.0.2并不支持TLS1.3协议,导致Requests库访问某些仅支持TLS1.3协议的https网站报错
当然也有其他办法解决笔者遇到的这个问题,但是笔者也希望能够将过老版本的Python3.6遗弃,使用较新Python3,同时不抛弃旧环境Python,以免旧程序出现特殊问题以备不时之需。
配置
首先本次使用的核心工具为Pyenv,一个简单的Python版本管理,该工具的Python环境均安装在用户目录下,不影响系统环境,同时可以切换多个Python版本并且管理性、易用性极佳,可以不礼貌的理解为简易版本的Anaconda,但是安装起来更加简单、更轻量化
下载Pyenv
Pyenv的官方地址:https://github.com/pyenv/pyenv
Linux安装方法:https://github.com/pyenv/pyenv?tab=readme-ov-file#automatic-installer
官方给出了安装bash,只需要简单执行一行bash便完成了安装。
1 | curl https://pyenv.run | bash |
配置Pyenv
安装完毕之后需要进行配置,理论上一般Linux系统都有.bashrc文件,直接执行一下bash命令,将环境变量导入
1 | echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc |
若无的话可参考官方其他导入方法:https://github.com/pyenv/pyenv?tab=readme-ov-file#set-up-your-shell-environment-for-pyenv
配置OpenSSL1.1.x
该步骤是本文演示中的升级到Python3.10之后OpenSSL库也同时追加编译urllib3>2.x版本,若OpenSSL为1.0.x版本,则urllib3<2.x版本。
例如Requests等网络请求功能不支持TLS1.3协议,若不需要该步骤可忽略直接进入下一部安装Python,但笔者依旧建议读者跟随笔者一同升级OpenSSL。
旧Linux机器OpenSSL基本为1.0.x版本理论上均该被迭代防止未来出现Bug。以下升级过程均为CentOS的演示,其他LinuxOS可查询互联网资料同理。
升级OpenSSL
执行以下命令,可以将OpenSSL1.1.x版本全家桶一同安装,省时省力
1 | yum install openssl11* |
此处即可以卸载旧版本OpenSSL1.0.x版本也可以不管,本文不建议卸载,但依旧想卸载可以继续阅读以下步骤。执行以下命令,无需追加*号,只需要卸载旧版本openssl即可。
1 | yum remove openssl |
为了防止某些程序直接调用openssl导致报错,可以进行软链接,防止某些程序报错
1 | ln -s /usr/bin/openssl11 /usr/bin/openssl |
安装Python
此时可以执行Pyenv命令,查看当前机器默认支持的最高版本Python版本
1 | pyenv install -l |
OpenSSL1.1.x下的特殊安装Python
本机器CentOS7.6仅支持最高Python3.10,本文以安装Python3.10为主,本条为结合了OpenSSL1.1.x环境的安装步骤,若无此需求直接跳过进入下一步骤。
由于需要追加一些参数将上述新安装的OpenSSL1.1.x版本并入build过程,否则默认build的OpenSSL为1.0.x版本,urllib3不会是>2.x版本,依旧不支持TLS1.3协议,执行以下命令配置build环境。
本文建议不要在追加3.10.x中的.x,Pyenv会自动追寻最后一个补丁版本。
1 | CPPFLAGS="$(pkg-config --cflags openssl11)" \ |
若非CentOS的话也要追加OpenSSL1.1.x版本,可以参考官方build文档:https://github.com/pyenv/pyenv/wiki/Common-build-problems
正常安装
正常只需要执行该命令即可
1 | pyenv install -v 3.10 |
切换Python
此刻安装完毕之后全局Python依旧是旧版本Python,需要进行全局切换,执行以下命令即可进行全局切换
1 | pyenv global <your python version> |
此刻Python、pip环境均为最新版本
额外
Pyenv其他用法
- 列出可安装的python版本: pyenv install -l
- 列出已安装的python版本: pyenv versions
- 安装python版本3.11.0: pyenv install 3.11.0
- 卸载python版本3.11.0: pyenv uninstall 3.11.0
- pyenv仅覆盖当前目录下的python版本: pyenv local <python版本>
- pyenv覆盖全局的python版本: pyenv global <python版本>
- pyenv覆盖当前shell的python版本-只影响当前的shell会话: pyenv shell <python版本>
- 取消pyenv全局覆盖:pyenv global system
- 取消pyenv覆盖当前shell版本:pyenv shell –unset
- pyenv的global、local、shell的优先级关系是:shell > local > global
某些情况下调用不到Pyenv安装的Python
虽然已经通过pyenv全局覆盖了新Python环境,但是某些情况下一些工具不读取环境变量导致依旧使用的是旧版本Python,解决方法为直接调用绝对路径下的新Python。
本文以root为例,绝对路径为/root/.pyenv/versions/3.10.13/bin/python。该方法可解决找不到路径的问题