超旧版本Linux下的超旧Python3升级到较新版本(不破坏旧Python3环境可随时切回)

超旧版本Linux下的超旧Python3升级到较新版本(不破坏旧Python3环境可随时切回)

一月 30, 2024

介绍

本文介绍为超旧版本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
2
3
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.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
2
3
CPPFLAGS="$(pkg-config --cflags openssl11)" \
LDFLAGS="$(pkg-config --libs openssl11)" \
pyenv install -v 3.10

若非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。该方法可解决找不到路径的问题