pyenv管理多个版本python的完整指南

 更新时间:2025年12月05日 09:05:12   作者:MrSYJ  
这篇文章主要为大家详细介绍了pyenv管理多个版本python的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解下

一.安装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 本身所必需的依赖,主要是 gccmake

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 中定义的安装规则(通常是 install target)。
  • 创建目录结构: 它在 $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.gitpyenv 官方项目的所有文件,完整地下载并复制到你的 主目录 (~) 下的 .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 相关的命令(如 pythonpip)时:

  • 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Django ImageFiled上传照片并显示的方法

    Django ImageFiled上传照片并显示的方法

    今天小编就为大家分享一篇Django ImageFiled上传照片并显示的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • 使用pyinstaller打包py文件的实现步骤

    使用pyinstaller打包py文件的实现步骤

    PyInstaller是一个用于将Python脚本打包成独立可执行文件的工具,本文主要介绍了使用pyinstaller打包py文件,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • Python自动化测试ConfigParser模块读写配置文件

    Python自动化测试ConfigParser模块读写配置文件

    本文主要介绍Python自动化测试,这里详细说明了ConfigParser模块读写配置文件,有兴趣的小伙伴可以参考下
    2016-08-08
  • 对Python中的条件判断、循环以及循环的终止方法详解

    对Python中的条件判断、循环以及循环的终止方法详解

    今天小编就为大家分享一篇对Python中的条件判断、循环以及循环的终止方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • python使用yaml格式文件的方法

    python使用yaml格式文件的方法

    本文主要介绍了python使用yaml格式文件的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Python带你从浅入深探究Tuple(基础篇)

    Python带你从浅入深探究Tuple(基础篇)

    大家都知道Python中的元组容器序列(tuple)与列表容器序列(list)有很多相同之处,他们虽然都可以存储任意类型的数据,但是一个元组定义好之后就不能够再进行修改,对Python Tuple相关知识感兴趣的朋友一起看看吧
    2021-05-05
  • 编写Python脚本来获取Google搜索结果的示例

    编写Python脚本来获取Google搜索结果的示例

    这篇文章主要介绍了编写Python脚本来获取Google搜索结果的示例,也是利用Python编写爬虫的一个简单实现,需要的朋友可以参考下
    2015-05-05
  • Python 虚拟空间的使用代码详解

    Python 虚拟空间的使用代码详解

    这篇文章主要介绍了Python 虚拟空间的使用,本文通过示例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • 在Linux中通过Python脚本访问mdb数据库的方法

    在Linux中通过Python脚本访问mdb数据库的方法

    这篇文章主要介绍了在Linux中通过Python脚本访问mdb数据库的方法,本文示例基于debian系的Linux系统,需要的朋友可以参考下
    2015-05-05
  • Python如何输出百分比

    Python如何输出百分比

    这篇文章主要介绍了Python 如何输出百分比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论