python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > pyenv管理多个版本python

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

作者: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

解释说明

流程总结:

4.make install做了什么

在您执行了 ./config shared --prefix=/usr/local/custom_ssl/openssl-1.1.1w 之后,make install 会执行以下任务:

所有文件都是相对于设置的 --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

大概原理是:

二.安装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_ROOT 下有一个关键的子目录叫 versions。所有通过 pyenv install 命令安装的 Python 环境都会存放在这里。

并且你的 PYENV_ROOT 是默认的 ~/.pyenv

列出所有的版本

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

您可能感兴趣的文章:
阅读全文