一.安装openssl
购买的阿里云服务器自带的 openssl版本太低了,1.0.2版本。但是python3.10版本需要的openssl至少是1.1.1版本
[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
yum install -y gcc make
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
# 切换到一个临时目录 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.配置编译和安装
# **使用 --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

解释说明
- 在
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
[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
export ld_library_path=/usr/local/custom_ssl/openssl-1.1.1w/lib:$ld_library_path
然后在执行
[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
1.克隆 pyenv 仓库到你的主目录
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
或者使用ssh方式,需要将你服务器的公钥复制到github中
git clone git@github.com:pyenv/pyenv.git ~/.pyenv
设置环境变量,将 pyenv 路径添加到环境变量
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版本了
# 查看所有可安装的版本 pyenv install --list # 安装你需要的版本,注意不要直接安装 需要配置指定的openssl pyenv install 3.10.12
3. 设置局部(local)python 版本
这是最关键的一步,它确保新安装的python版本只对你的当前项目目录生效。
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的工作原理
1.查找版本: 它首先检查您指定的 <version> (例如 3.10.12) 是否已经存在于您的 ~/.pyenv/versions/ 目录下。
如果不存在,它会报错,提示您需要先运行 pyenv install <version>。
2.创建文件: 如果版本已安装,它会在您当前所在的目录中创建一个名为 .python-version 的文件。
3.写入版本号: 这个文件里只包含一行文本,就是您指定的版本号(例如 3.10.12)。
4.运行时切换: 当您运行任何 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 都能顺利编译,需要安装所有必需的编译工具和通用依赖。
# 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
2.安装openssl
# 定义安装目录(非常关键) 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
# 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如果慢 就使用镜像,设置环境变量
export python_build_mirror_url="https://mirrors.tuna.tsinghua.edu.cn/python/" export python_build_mirror_url_skip_checksum=1
到此这篇关于pyenv管理多个版本python的完整指南的文章就介绍到这了,更多相关pyenv管理多个版本python内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论