pyenv管理多個(gè)版本python的完整指南
一.安裝openssl
購(gòu)買的阿里云服務(wù)器自帶的 openssl版本太低了,1.0.2版本。但是python3.10版本需要的openssl至少是1.1.1版本
[xpe@ilabx_ide ~]$ openssl version OpenSSL 1.0.2k-fips 26 Jan 2017
所以我們需要單獨(dú)在裝一個(gè)新版本的OpenSSL,并且不能影響系統(tǒng)已有的舊版本openssl。
不影響系統(tǒng)現(xiàn)有 OpenSSL 1.0.x 的情況下,手動(dòng)編譯并安裝一個(gè) OpenSSL 1.1.1 的副本,然后強(qiáng)制 pyenv 使用這個(gè)新版本來(lái)編譯 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 # 針對(duì) Python 3.10 的 lzma 模塊

我們將把 OpenSSL 1.1.1 安裝到 /usr/local/custom_ssl/openssl-1.1.1
2.下載 openssl-1.1.1w.tar.gz
# 切換到一個(gè)臨時(shí)目錄 cd /tmp # 下載 OpenSSL 1.1.1 (這是一個(gè) LTS 版本,非常適合 Python 3.10) # **注意:請(qǐng)檢查最新的 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 指定安裝到一個(gè)隔離的目錄** # 建議您在 /usr/local 下創(chuàng)建一個(gè)非沖突目錄 INSTALL_PATH=/usr/local/custom_ssl/openssl-1.1.1w # 配置:使用 shared 選項(xiàng)以便于 Python 鏈接 ./config shared --prefix=$INSTALL_PATH # 編譯 make # **安裝 (這一步可能需要 sudo 權(quán)限)** sudo make install

解釋說(shuō)明
- 在
config階段使用了--prefix=$INSTALL_PATH,所以生成的Makefile才知道在您運(yùn)行make install時(shí),應(yīng)該把編譯好的 OpenSSL 文件復(fù)制到/usr/local/custom_ssl/openssl-1.1.1w這個(gè)目標(biāo)目錄中去 make負(fù)責(zé)將原始的源代碼(.c,.h文件等)轉(zhuǎn)換成機(jī)器可執(zhí)行的二進(jìn)制成品(可執(zhí)行文件.exe或庫(kù)文件.so/.a)。這個(gè)過(guò)程是 “生產(chǎn)” 。make install負(fù)責(zé)將這些 “生產(chǎn)好的成品” 從源代碼目錄復(fù)制到您指定的最終安裝位置(由./config --prefix指定)。這個(gè)過(guò)程是 “部署” 。
流程總結(jié):
- 配置 (
./config) → 生產(chǎn)藍(lán)圖 (Makefile) - 構(gòu)建 (
make) → 按照藍(lán)圖生產(chǎn)成品 (.so,.a文件) - 安裝 (
make install) → 將成品部署到最終位置 (--prefix路徑)
4.make install做了什么
在您執(zhí)行了 ./config shared --prefix=/usr/local/custom_ssl/openssl-1.1.1w 之后,make install 會(huì)執(zhí)行以下任務(wù):
- 讀取安裝規(guī)則: 它讀取
Makefile中定義的安裝規(guī)則(通常是installtarget)。 - 創(chuàng)建目錄結(jié)構(gòu): 它在
$INSTALL_PATH下創(chuàng)建標(biāo)準(zhǔn)的子目錄,例如bin/、lib/、include/、share/等。 - 復(fù)制文件: 它將
make編譯好的所有文件,根據(jù)它們的類型,復(fù)制到$INSTALL_PATH下對(duì)應(yīng)的子目錄中。
所有文件都是相對(duì)于設(shè)置的 --prefix 路徑 $INSTALL_PATH (/usr/local/custom_ssl/openssl-1.1.1w) 進(jìn)行安裝的
5.總結(jié)關(guān)鍵點(diǎn)
路徑隔離: 由于您使用了 --prefix,所有這些文件都被安全地安裝到了 /usr/local/custom_ssl/openssl-1.1.1w 這個(gè)隔離的沙盒中。它們不會(huì)覆蓋或干擾您系統(tǒng)上任何依賴 OpenSSL 1.0.x 的現(xiàn)有 Python 2 或 Python 3.6 程序。
編譯目的: 通過(guò) make install,我們確保了 OpenSSL 1.1.1w 的 庫(kù)文件 (lib/) 和 頭文件 (include/) 結(jié)構(gòu)完整地存在于一個(gè)確定的、非系統(tǒng)默認(rèn)的路徑下。
驗(yàn)證:執(zhí)行./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
發(fā)現(xiàn)報(bào)錯(cuò),可以用 臨時(shí)設(shè)置環(huán)境變量 LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/usr/local/custom_ssl/openssl-1.1.1w/lib:$LD_LIBRARY_PATH
然后在執(zhí)行
[xpe@s71 bin]$ ./openssl version OpenSSL 1.1.1w 11 Sep 2023
大概原理是:
- 程序啟動(dòng): 運(yùn)行
./openssl version。 - 鏈接器工作: 動(dòng)態(tài)鏈接器啟動(dòng),開始尋找
libssl.so.1.1。 - 命中
LD_LIBRARY_PATH: 鏈接器發(fā)現(xiàn)LD_LIBRARY_PATH已經(jīng)被設(shè)置為/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 程序運(yùn)行。
二.安裝pyenv
切換到具體的用戶下 去安裝pyenv 這里采用git的方式
使用 Git 工具,將位于 https://github.com/pyenv/pyenv.git 的 pyenv 官方項(xiàng)目的所有文件,完整地下載并復(fù)制到你的 主目錄 (~) 下的 .pyenv 隱藏文件夾 中
1.下載pyenv
1.克隆 pyenv 倉(cāng)庫(kù)到你的主目錄
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
或者使用ssh方式,需要將你服務(wù)器的公鑰復(fù)制到github中
git clone git@github.com:pyenv/pyenv.git ~/.pyenv
設(shè)置環(huán)境變量,將 pyenv 路徑添加到環(huán)境變量
2. 將 pyenv 路徑添加到環(huán)境變量
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來(lái)管理多個(gè)python版本了
# 查看所有可安裝的版本 pyenv install --list # 安裝你需要的版本,注意不要直接安裝 需要配置指定的openssl pyenv install 3.10.12
3. 設(shè)置局部(Local)Python 版本
這是最關(guān)鍵的一步,它確保新安裝的Python版本只對(duì)你的當(dāng)前項(xiàng)目目錄生效。
mkdir -p ~/my_new_project cd ~/my_new_project pyenv local 3.10.12
這個(gè)命令會(huì)在你的項(xiàng)目目錄下創(chuàng)建一個(gè)名為 .python-version 的文件,文件內(nèi)容就是 3.10.12。
現(xiàn)在,當(dāng)你在這個(gè)目錄內(nèi)時(shí),你使用的就是局部安裝的Python。
驗(yàn)證: which python
這個(gè)命令的作用是設(shè)置和綁定(set and bind)一個(gè)已經(jīng)安裝好的 Python 版本到當(dāng)前的目錄。
4.pyenv local的工作原理
1.查找版本: 它首先檢查您指定的 <version> (例如 3.10.12) 是否已經(jīng)存在于您的 ~/.pyenv/versions/ 目錄下。
如果不存在,它會(huì)報(bào)錯(cuò),提示您需要先運(yùn)行 pyenv install <version>。
2.創(chuàng)建文件: 如果版本已安裝,它會(huì)在您當(dāng)前所在的目錄中創(chuàng)建一個(gè)名為 .python-version 的文件。
3.寫入版本號(hào): 這個(gè)文件里只包含一行文本,就是您指定的版本號(hào)(例如 3.10.12)。
4.運(yùn)行時(shí)切換: 當(dāng)您運(yùn)行任何 Python 相關(guān)的命令(如 python 或 pip)時(shí):
pyenv會(huì)通過(guò)其在 Shell 配置中注入的**墊片(shims)**機(jī)制攔截這個(gè)命令。pyenv會(huì)從當(dāng)前目錄開始,向上級(jí)目錄逐級(jí)查找這個(gè).python-version文件。- 找到文件后,
pyenv會(huì)讀取里面的版本號(hào),并修改您的PATH,將命令執(zhí)行重定向到~/.pyenv/versions/<version>/bin/python。
在 PYENV_ROOT 下有一個(gè)關(guān)鍵的子目錄叫 versions。所有通過(guò) pyenv install 命令安裝的 Python 環(huán)境都會(huì)存放在這里。
并且你的 PYENV_ROOT 是默認(rèn)的 ~/.pyenv
- 用戶隔離: 所有安裝都在你的用戶主目錄下,不影響系統(tǒng)的全局安裝(通常在
/usr/bin/python或/usr/local/bin/python)。 - 環(huán)境獨(dú)立: 每個(gè)版本都是一個(gè)完全獨(dú)立、自包含的環(huán)境,互不干擾。
列出所有的版本
pyenv versions

* 星號(hào): 星號(hào)(*)標(biāo)記當(dāng)前 Shell 正在使用的 Python 版本。在上面的例子中,當(dāng)前使用的是 system 版本(即系統(tǒng)自帶的 Python)。
顯示當(dāng)前用的哪個(gè)版本
pyenv version
完整步驟
1.為了確保 OpenSSL 和 Python 都能順利編譯,需要安裝所有必需的編譯工具和通用依賴。
# 1. 確保安裝了基本的編譯工具 (gcc, make)
sudo yum install -y gcc make
# 2. 確保安裝了 Python 編譯可能需要的所有通用開發(fā)依賴包
# 盡管我們隔離安裝 OpenSSL,但其他 Python 模塊可能需要這些系統(tǒng)的 devel 包
sudo yum install -y \
zlib-devel \
bzip2-devel \
readline-devel \
sqlite-devel \
libffi-devel \
xz-devel
2.安裝OPENSSL
# 定義安裝目錄(非常關(guān)鍵) INSTALL_PATH=/usr/local/custom_ssl/openssl-1.1.1w # 1. 切換到臨時(shí)目錄 cd /tmp # 2. 下載 OpenSSL 1.1.1w 源代碼 (請(qǐng)確認(rèn)這是最新的 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 選項(xiàng)和 --prefix 指定隔離路徑) # **注意:以下命令需要 root 或 sudo 權(quán)限來(lái)執(zhí)行 make install** ./config shared --prefix=$INSTALL_PATH # 5. 編譯 make # 6. 安裝 (使用 sudo 權(quán)限將編譯結(jié)果安裝到隔離目錄) sudo make install # 7. 清理臨時(shí)文件 (可選) 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. 設(shè)置環(huán)境變量并運(yùn)行 pyenv install # PYTHON_CONFIGURE_OPTS 是最關(guān)鍵的,它告訴 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. 驗(yàn)證安裝 pyenv versions # 應(yīng)該會(huì)看到 3.10.12 # 5. 激活并測(cè)試 Python pyenv local 3.10.12 # 或者 pyenv global 3.10.12 python -c "import ssl; print(ssl.OPENSSL_VERSION)" # 應(yīng)該輸出 OpenSSL 1.1.1w ... 或類似的版本信息,而不是 1.0.x
安裝過(guò)程 如下圖:
安裝python如果慢 就使用鏡像,設(shè)置環(huán)境變量
export PYTHON_BUILD_MIRROR_URL="https://mirrors.tuna.tsinghua.edu.cn/python/" export PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM=1
到此這篇關(guān)于pyenv管理多個(gè)版本python的完整指南的文章就介紹到這了,更多相關(guān)pyenv管理多個(gè)版本python內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python?實(shí)現(xiàn)?mp3Play?音頻播放
這篇文章主要介紹了python?實(shí)現(xiàn)?mp3Play?音頻播放,文章基于python的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考價(jià)值需要的小伙伴可以參考一下2022-04-04
通過(guò)Python編寫一個(gè)簡(jiǎn)單登錄功能過(guò)程解析
這篇文章主要介紹了通過(guò)Python編寫一個(gè)簡(jiǎn)單登錄功能過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Python實(shí)現(xiàn)的根據(jù)文件名查找數(shù)據(jù)文件功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)的根據(jù)文件名查找數(shù)據(jù)文件功能,涉及Python針對(duì)文件與目錄的遍歷、查詢等相關(guān)操作技巧,需要的朋友可以參考下2018-05-05
Linux下使用python自動(dòng)修改本機(jī)網(wǎng)關(guān)代碼分享
這篇文章主要介紹了Linux下使用python自動(dòng)修改本機(jī)網(wǎng)關(guān)代碼分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-05-05

