一.安装openssl
购买的阿里云服务器自带的 openssl版本太低了,1.0.2版本。但是python3.10版本需要的openssl至少是1.1.1版本
bash
[xpe@ilabx_ide ~]$ openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
所以我们需要单独在装一个新版本的OpenSSL,并且不能影响系统已有的旧版本openssl。
不影响系统现有 OpenSSL 1.0.x 的情况下,手动编译并安装一个 OpenSSL 1.1.1 的副本,然后强制 pyenv 使用这个新版本来编译 Python 3.10.12。
1.安装openssl 具体步骤
编译 OpenSSL 本身所必需的依赖,主要是 gcc 和 make
Bash
yum install -y gcc make
perl
sudo yum install -y \
gcc make \
openssl-devel \
zlib-devel \
bzip2-devel \
readline-devel \
sqlite-devel \
libffi-devel \
xz-devel # 针对 Python 3.10 的 lzma 模块

我们将把 OpenSSL 1.1.1 安装到 /usr/local/custom_ssl/openssl-1.1.1
2.下载 openssl-1.1.1w.tar.gz
bash
# 切换到一个临时目录
cd /tmp
# 下载 OpenSSL 1.1.1 (这是一个 LTS 版本,非常适合 Python 3.10)
# **注意:请检查最新的 1.1.1 版本,这里以 1.1.1w 为例**
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
# 解压
tar -xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w/
3.配置编译和安装
ini
# **使用 --prefix 指定安装到一个隔离的目录**
# 建议您在 /usr/local 下创建一个非冲突目录
INSTALL_PATH=/usr/local/custom_ssl/openssl-1.1.1w
# 配置:使用 shared 选项以便于 Python 链接
./config shared --prefix=$INSTALL_PATH
# 编译
make
# **安装 (这一步可能需要 sudo 权限)**
sudo make install

解释说明
1.在
config阶段使用了--prefix=$INSTALL_PATH,所以生成的Makefile才知道在您运行make install时,应该把编译好的 OpenSSL 文件复制到/usr/local/custom_ssl/openssl-1.1.1w这个目标目录中去
make负责将原始的源代码(.c,.h文件等)转换成机器可执行的二进制成品 (可执行文件.exe或库文件.so/.a)。这个过程是 "生产" 。make install负责将这些 "生产好的成品" 从源代码目录复制到您指定的最终安装位置(由./config --prefix指定)。这个过程是 "部署" 。
流程总结:
- 配置 (
./config) → 生产蓝图 (Makefile) - 构建 (
make) → 按照蓝图生产成品 (.so,.a文件) - 安装 (
make install) → 将成品部署到最终位置 (--prefix路径)
4.make install 做了什么?
在您执行了 ./config shared --prefix=/usr/local/custom_ssl/openssl-1.1.1w 之后,make install 会执行以下任务:
- 读取安装规则: 它读取
Makefile中定义的安装规则(通常是installtarget)。 - 创建目录结构: 它在
$INSTALL_PATH下创建标准的子目录,例如bin/、lib/、include/、share/等。 - 复制文件: 它将
make编译好的所有文件,根据它们的类型,复制到$INSTALL_PATH下对应的子目录中。
所有文件都是相对于设置的 --prefix 路径 $INSTALL_PATH (/usr/local/custom_ssl/openssl-1.1.1w) 进行安装的
5.总结关键点:
- 路径隔离: 由于您使用了
--prefix,所有这些文件都被安全地安装到了/usr/local/custom_ssl/openssl-1.1.1w这个隔离的沙盒中。它们不会覆盖或干扰您系统上任何依赖 OpenSSL 1.0.x 的现有 Python 2 或 Python 3.6 程序。 - 编译目的: 通过
make install,我们确保了 OpenSSL 1.1.1w 的 库文件 (lib/) 和 头文件 (include/) 结构完整地存在于一个确定的、非系统默认的路径下。
验证:执行./openssl version
python
[root@s71 bin]# ./openssl version
./openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
发现报错,可以用 临时设置环境变量 LD_LIBRARY_PATH
bash
export LD_LIBRARY_PATH=/usr/local/custom_ssl/openssl-1.1.1w/lib:$LD_LIBRARY_PATH
然后在执行
ruby
[xpe@s71 bin]$ ./openssl version
OpenSSL 1.1.1w 11 Sep 2023
大概原理是:
-
程序启动: 运行
./openssl version。 -
链接器工作: 动态链接器启动,开始寻找
libssl.so.1.1。 -
命中
LD_LIBRARY_PATH: 链接器发现LD_LIBRARY_PATH已经被设置为/usr/local/custom_ssl/openssl-1.1.1w/lib:... -
加载成功: 链接器在
/usr/local/custom_ssl/openssl-1.1.1w/lib目录中找到了libssl.so.1.1,成功加载并允许您的 OpenSSL 1.1.1w 程序运行。
二.安装pyenv
切换到具体的用户下 去安装pyenv 这里采用git的方式
使用 Git 工具,将位于 https://github.com/pyenv/pyenv.git 的 pyenv 官方项目 的所有文件,完整地下载并复制到你的 主目录 (~) 下的 .pyenv 隐藏文件夹 中
1.下载pyenv
js
# 1. 克隆 pyenv 仓库到你的主目录
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
或者使用ssh方式,需要将你服务器的公钥复制到github中
git clone git@github.com:pyenv/pyenv.git ~/.pyenv
设置环境变量,将 pyenv 路径添加到环境变量
bash
# 2. 将 pyenv 路径添加到环境变量
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
# 3. 初始化 pyenv
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init --path)"\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc
# 4. 重新加载 shell 配置
source ~/.bashrc
2.pyenv常用命令
然后就可以使用pyenv来管理多个python版本了
bash
# 查看所有可安装的版本
pyenv install --list
# 安装你需要的版本,注意不要直接安装 需要配置指定的openssl
pyenv install 3.10.12
3. 设置局部(Local)Python 版本
这是最关键的一步,它确保新安装的Python版本只对你的当前项目目录生效。
Bash
mkdir -p ~/my_new_project
cd ~/my_new_project
pyenv local 3.10.12
这个命令会在你的项目目录下创建一个名为 .python-version 的文件,文件内容就是 3.10.12。
现在,当你在这个目录内时,你使用的就是局部安装的Python。
验证: which python
这个命令的作用是设置和绑定(set and bind)一个已经安装好的 Python 版本到当前的目录。
4.pyenv local 的工作原理:
-
查找版本: 它首先检查您指定的
<version>(例如3.10.12) 是否已经存在于您的~/.pyenv/versions/目录下。- 如果不存在 ,它会报错,提示您需要先运行
pyenv install <version>。
- 如果不存在 ,它会报错,提示您需要先运行
-
创建文件: 如果版本已安装,它会在您当前所在的目录中创建一个名为
.python-version的文件。 -
写入版本号: 这个文件里只包含一行文本,就是您指定的版本号(例如
3.10.12)。 -
运行时切换: 当您运行任何 Python 相关的命令(如
python或pip)时:pyenv会通过其在 Shell 配置中注入的**垫片(shims)**机制拦截这个命令。pyenv会从当前目录开始,向上级目录逐级查找这个.python-version文件。- 找到文件后,
pyenv会读取里面的版本号,并修改您的PATH,将命令执行重定向到~/.pyenv/versions/<version>/bin/python。
在 PYENV_ROOT 下有一个关键的子目录叫 versions。所有通过 pyenv install 命令安装的 Python 环境都会存放在这里。
并且你的 PYENV_ROOT 是默认的 ~/.pyenv
-
用户隔离: 所有安装都在你的用户主目录下,不影响 系统的全局安装(通常在
/usr/bin/python或/usr/local/bin/python)。 -
环境独立: 每个版本都是一个完全独立、自包含的环境,互不干扰。
列出所有的版本
pyenv versions

* 星号: 星号(*)标记当前 Shell 正在使用的 Python 版本。在上面的例子中,当前使用的是 system 版本(即系统自带的 Python)。
显示当前用的哪个版本
pyenv version
完整步骤
1.为了确保 OpenSSL 和 Python 都能顺利编译,需要安装所有必需的编译工具和通用依赖。
Bash
# 1. 确保安装了基本的编译工具 (gcc, make)
sudo yum install -y gcc make
# 2. 确保安装了 Python 编译可能需要的所有通用开发依赖包
# 尽管我们隔离安装 OpenSSL,但其他 Python 模块可能需要这些系统的 devel 包
sudo yum install -y \
zlib-devel \
bzip2-devel \
readline-devel \
sqlite-devel \
libffi-devel \
xz-devel
- 安装OPENSSL
Bash
# 定义安装目录(非常关键)
INSTALL_PATH=/usr/local/custom_ssl/openssl-1.1.1w
# 1. 切换到临时目录
cd /tmp
# 2. 下载 OpenSSL 1.1.1w 源代码 (请确认这是最新的 1.1.1 版本)
# 推荐使用:
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
# 3. 解压源代码
tar -xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w/
# 4. 配置 (使用 shared 选项和 --prefix 指定隔离路径)
# **注意:以下命令需要 root 或 sudo 权限来执行 make install**
./config shared --prefix=$INSTALL_PATH
# 5. 编译
make
# 6. 安装 (使用 sudo 权限将编译结果安装到隔离目录)
sudo make install
# 7. 清理临时文件 (可选)
cd /tmp
rm -rf openssl-1.1.1w openssl-1.1.1w.tar.gz
3.使用上一步的openssl 编译python
Bash
# 1. 定义 OpenSSL 的安装根目录
export OPENSSL_ROOT=/usr/local/custom_ssl/openssl-1.1.1w
# 2. 确保之前失败的版本被清理(如果存在)
pyenv uninstall 3.10.12
# 3. 设置环境变量并运行 pyenv install
# PYTHON_CONFIGURE_OPTS 是最关键的,它告诉 Python 配置脚本 OpenSSL 的路径。
PYTHON_CONFIGURE_OPTS="--with-openssl=$OPENSSL_ROOT" \
CFLAGS="-I$OPENSSL_ROOT/include" \
LDFLAGS="-L$OPENSSL_ROOT/lib" \
pyenv install 3.10.12
# 4. 验证安装
pyenv versions
# 应该会看到 3.10.12
# 5. 激活并测试 Python
pyenv local 3.10.12 # 或者 pyenv global 3.10.12
python -c "import ssl; print(ssl.OPENSSL_VERSION)"
# 应该输出 OpenSSL 1.1.1w ... 或类似的版本信息,而不是 1.0.x
安装过程 如下图:
安装python如果慢 就使用镜像,设置环境变量
ini
export PYTHON_BUILD_MIRROR_URL="https://mirrors.tuna.tsinghua.edu.cn/python/"
export PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM=1