pyenv管理多个版本的python,你造吗?我才造

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

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 指定)。这个过程是 "部署"

流程总结:

  1. 配置 (./config) → 生产蓝图 (Makefile)
  2. 构建 (make) → 按照蓝图生产成品 (.so, .a 文件)
  3. 安装 (make install) → 将成品部署到最终位置 (--prefix 路径)

4.make install 做了什么?

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

  1. 读取安装规则: 它读取 Makefile 中定义的安装规则(通常是 install target)。
  2. 创建目录结构: 它在 $INSTALL_PATH 下创建标准的子目录,例如 bin/lib/include/share/ 等。
  3. 复制文件: 它将 make 编译好的所有文件,根据它们的类型,复制到 $INSTALL_PATH 下对应的子目录中。

所有文件都是相对于设置的 --prefix 路径 $INSTALL_PATH (/usr/local/custom_ssl/openssl-1.1.1w) 进行安装的

5.总结关键点:

  1. 路径隔离: 由于您使用了 --prefix,所有这些文件都被安全地安装到了 /usr/local/custom_ssl/openssl-1.1.1w 这个隔离的沙盒中。它们不会覆盖或干扰您系统上任何依赖 OpenSSL 1.0.x 的现有 Python 2 或 Python 3.6 程序。
  2. 编译目的: 通过 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.gitpyenv 官方项目 的所有文件,完整地下载并复制到你的 主目录 (~) 下的 .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 的工作原理:

  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 都能顺利编译,需要安装所有必需的编译工具和通用依赖。

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
  1. 安装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
相关推荐
咕白m6251 小时前
Python 实现 Word 到 Markdown 的转换
后端·python
sijiaoh1 小时前
我的 Claude Code 最佳实践
ai编程
β添砖java1 小时前
python第一阶段第八章文件操作
开发语言·python
天才测试猿1 小时前
树控件、下拉框、文本框常用测试用例
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
灵梦归希1 小时前
bugku的奇怪的二维码
python
将心ONE1 小时前
pip导出项目依赖
开发语言·python·pip
shx66662 小时前
2.2.1 ROS2 在功能包中编写 Python 节点
开发语言·python·ros2