附001.Python多版本環境管理

2022-05-29 18:03:27

一 環境背景

由於Python的版本過多,且不同版本之間差異性較大。同時又因系統底層需要呼叫當前版本Python,所以不能隨意變更當前系統Python版本。因此,在多版本共存的情況下,Python多環境管理工具非常重要,常見Python多環境管理工具有Pyenv和Virtualenv。

Pyenv對Python的版本進行管理,實現不通版本間的切換和使用;

Virtualenv通過建立虛擬環境,實現與系統環境以及其他Python環境的隔離。

二 pyenv部署與使用

2.1 pyenv簡介

pyenv是一個Python版本管理工具,可方便地切換全域性Python版本,安裝多個不通的Python版本,設定獨立的某個資料夾或工程目錄特意的Python版本,同時建立Python虛擬環境。

注意:該工具不支援Windows。

2.2 pyenv工作原理

  1. pyenv安裝後會在系統PATH中插入shims路徑,每次執行Python相關的可執行檔案時,會優先在shims裡查詢Python路徑~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin;
  2. 系統選擇Python版本,依如下順序選擇Python版本:
    1. Shell變數設定(執行pyenv shell檢視)
    2. 當前可執行檔案目錄下的.python_version檔案裡的版本號(執行pyenv shell檢視)
    3. 上層目錄查詢找到的第一次.pyenv-version檔案
    4. 全域性的版本號在~/.pyenv/version檔案內(執行pyenv shell檢視)
  1. 確定版本檔案的位置和Python版本後,pyenv會根據版本號在~/.pyenv/versions/資料夾中查詢對應的Python版本。

提示:執行命令pyenv versions可檢視系統當前安裝的Python版本。

python優先順序:shell > local > global

pyenv 會從當前目錄開始向上逐級查詢.python-version檔案,直到根目錄為止。若找不到,就用global版本。

2.3 pyenv安裝部署-手動安裝

[root@localhost ~]# yum -y install git		#安裝git工具
[root@localhost ~]# yum -y install gcc zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel			#安裝相關環境基礎包
[root@localhost ~]# git clone https://github.com/pyenv/pyenv.git ~/.pyenv
#clone pyenv至家目錄
[root@localhost ~]# echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
[root@localhost ~]# echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
[root@localhost ~]# echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
#修改環境變數
[root@localhost ~]# source ~/.bash_profile		#重啟當前Shell
[root@localhost ~]# pyenv versions			#檢視版本

clipboard

2.4 pyenv安裝部署-自動安裝

[root@localhost ~]# yum -y install git		#安裝git工具
[root@localhost ~]# yum -y install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel		#安裝相關環境基礎包
[root@localhost ~]# curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
[root@localhost ~]# pyenv versions			#檢視版本

clipboard

提示:手動安裝和自動擋安裝任選其一即可。

自動安裝可能出現環境變數未新增的情況,可參考手動安裝進行新增。

2.4 pyenv使用範例

[root@localhost ~]# pyenv update			#pyenv升級

[root@localhost ~]# rm -rf $(pyenv root)		#解除安裝
[root@localhost ~]# vi ~/.bash_profile			#刪除以下條目
export PATH="~/.pyenv/bin:$PATH"			#刪除
eval "$(pyenv init -)"					#刪除
eval "$(pyenv virtualenv-init -)"			#刪除

[root@localhost ~]# pyenv install -list			#檢視可安裝的版本列表
[root@localhost ~]# pyenv install 3.6.5			#安裝指定版本的Python
[root@localhost tmp]# pyenv local 2.7.15

clipboard

#切換當前目錄的Python版本,通過將版本號寫入當前目錄下的.python-version檔案的方式。通過這種方式設定的 Python版本優先順序較global高。

[root@localhost tmp]# pyenv global 3.6.5

clipboard

#設定全域性的Python版本,通過將版本號寫入~/.pyenv/version檔案的方式。

2.5 pyenv常見引數

常用命令
命令
說明
pyenv version
顯示當前Python的版本和來源。
pyenv versions
列出當前環境的所有可用Python版本。
pyenv install -l
列出所有可以安裝的Python版本。
pyenv install -v
安裝Python,-v 顯示編譯過程。
pyenv shell
檢視或列出、設定Shell環境下的的Python版本,
設定當前shell session的Python版本,它的優先順序高於global和local。
pyenv shell –unset
取消shell版本設定。
pyenv global
檢視或列出、設定全域性環境下的的Python版本,
設定全域性Python版本替換系統自帶版本,可能會引起某些設定失效
(如yum命令),不建議使用!!!設定後恢復系統版本:pyenv global system。
pyenv local
檢視或列出、設定當前環境下的的Python版本,
設定當前使用者的可用的本地Python版本,它的優先順序高於全域性Python版本。
pyenv local –unset
取消本地版本設定。
pyenv uninstall
解除安裝特定Python版本。
pyenv which
列出command的全路徑。
pyenv whence
列出包含command的所有Python版本。
pyenv commands
列出所有pyenv可用命令列。
pyenv rehash
重新載入pyenv的shims路徑,即重新整理資料庫,
安裝完Python版本後下需要執行該命令。

參考連結:https://github.com/pyenv/pyenv#installation

三 Virtualenv部署與使用

3.1 Virtualenv簡介

Virtualenv試試一個用來為一個應用建立一套「隔離」的Python執行環境,使得每個應用擁有一套「獨立」的Python執行環境。Virtualenv通過建立一個虛擬化的python執行環境,將我們所需的依賴安裝進去的,不同專案之間相互不干擾。特點:

  • 在沒有許可權的情況下安裝新套件
  • 不同應用可以使用不同的套件版本
  • 套件升級不影響其他應用

3.2 Virtualenv安裝部署

[root@localhost ~]# pip install virtualenv

clipboard

提示:pip的安裝參考《001.Pip簡介及使用》,也可使用以下方式安裝:

[root@localhost ~]# yum -y install python-virtualenv

3.3 Virtualenv的使用

[root@localhost ~]# mkdir /study		#建立工作目錄
[root@localhost ~]# cd /study/			#進入工作目錄
[root@localhost study]# virtualenv venv         #為此工程建立一個虛擬環境,venv為虛擬環境目錄名,目錄名自定義

提示:

virtualenv venv將會在當前的目錄中建立一個資料夾,包含了Python可執行檔案,以及pip庫的一份拷貝,這樣就能安裝其他包了。虛擬環境的名字(此例中是 venv )可以是任意的,若省略名字將會把檔案均放在當前目錄。

在任何你執行命令的目錄中,這會建立Python的拷貝,並將之放在叫做 venv 的檔案中。

[root@localhost study]# virtualenv -p /usr/bin/python2.7 study01   #-p引數指定Python直譯器程式路徑
[root@localhost study]# source study01/bin/activate	#啟用虛擬環境
(study01)[root@localhost study]# deactivate		#退出當前系統環境

3.3 virtualenv常見引數

# virtualenv [OPTIONS] DEST_DIR 
選項:
--version		#顯示當前版本號。 
-h, –help		#顯示幫助資訊。 
-v, –verbose		#顯示詳細資訊。 
-q, –quiet		#不顯示詳細資訊。 
-p PYTHON_EXE, –python=PYTHON_EXE
#指定所用的python解析器的版本,比如–python=python2.5就使用2.5版本的解析器建立新的隔離環境。
#預設使用的是當前系統安裝(/usr/bin/python)的python解析器 
--clear			#清空非root使用者的安裝,並重頭開始建立隔離環境。 
--no-site-packages	#令隔離環境不能存取系統全域性的site-packages目錄。 
--system-site-packages	#令隔離環境可以存取系統全域性的site-packages目錄。 
--unzip-setuptools	#安裝時解壓Setuptools或Distribute 
--relocatable
#重定位某個已存在的隔離環境。使用該選項將修正指令碼並令所有.pth檔案使用相當路徑。 
--distribute
#使用Distribute代替Setuptools,也可設定環境變數VIRTUALENV_DISTRIBUTE達到同樣效要。 
--extra-search-dir=SEARCH_DIRS
#用於查詢setuptools/distribute/pip釋出包的目錄。可以新增任意數量的–extra-search-dir路徑。 
--never-download
#禁止從網上下載任何資料。此時,如果在本地搜尋釋出包失敗,virtualenv就會報錯。 
--prompt==PROMPT	#定義隔離環境的命令列字首。 

四 update-alternatives部署與使用

4.1 update-alternatives簡介

update-alternatives是用來維護系統命令的符號連結,以決定系統預設使用什麼命令,可以設定系統預設載入的首選程式。即用於處理linux系統中軟體版本的切換。

4.2 update-alternatives安裝部署

各個linux發行版中均提供了該命令,可免安裝直接使用,命令引數略有差異,本實驗以CentOS7.8為基礎。

4.3 update-alternatives的使用

[root@localhost ~]# update-alternatives --help
Commands:
  --install <link> <name> <path> <priority>
[--slave <link> <name> <path>] ...	#在系統中加入一組候選項
  --remove <name> <path>		#從 <name> 替換組中去除 <path> 項
  --remove-all <name>			#從替換系統中刪除整個 <name> 替換組
  --auto <name>				#將 <name> 的主連結切換到自動模式
  --display <name>			#顯示關於 <name> 替換組的資訊
  --query <name>			#機器可讀版的 --display <name>
  --list <name>				#列出 <name> 替換組中所有的可用候選項項
  --get-selections			#列出主要候選項名稱以及它們的狀態
  --set-selections			#從標準輸入中讀入候選項的狀態
  --config <name>			#列出 <name> 替換組中的可選項,並就使用其中哪一個,徵詢使用者的意見
  --set <name> <path>			#將 <path> 設定為 <name> 的候選項
  --all					#對所有可選項一一呼叫 --config 命令

<link>:是指向 /etc/alternatives/<name> 的符號連結>,如/usr/bin/python;
<name>:是該連結替換組的主控名,如python;
<path>:是替換專案標檔案的真實位置/usr/local/python3/bin/python3.9;
<priority>:是一個整數,在自動模式下,這個數位越高的選項,其優先順序也就越高。
Options:
  --altdir <directory>		#指定不同的可選專案錄
  --admindir <directory>	#指定不同的管理目錄
  --log <file>			#設定log檔案
  --force			#就算沒有通過自檢,也強制執行操作
  --skip-auto			#在自動模式中跳過設定正確候選項的提示,只與--config 有關
  --verbose			#詳盡的操作進行資訊,更多的輸出
  --quiet			#安靜模式,輸出儘可能少的資訊
  --help			#顯示本幫助資訊
  --version			#顯示版本資訊.

注意:alternatives是update-alternatives的軟連結,後續直接使用alternatives。

display:display選項用來顯示一個命令連結的所有可選命令,即檢視一個命令連結組的所有資訊,包括連結的模式(自動還是手動)、連結priority值、所有可 用的連結命令等等。

install:install選項的功能就是增加一組新的系統命令連結符。

使用語法為:update-alternatives --install <link> <name> <path> <priority> [--slave link name path]。其中link為系統中功能相同軟體的公共連結目錄,比如/usr/bin/java(需絕對目錄); name為命令連結符名稱,如java;path為你所要使用新命令、新軟體的所在目錄;priority為優先順序,當命令連結已存在時,需高於當前值,因為當alternative為自動模式時,系統預設啟用priority高的連結;–slave為從alternative。

config:config選項用來顯示和修改實際指向的候選命令,為在現有的命令連結選擇一個作為系統預設。

remove:remove選項的功能是刪除一個命令的link值,其附帶的slave也將一起刪除。

使用語法為:update-alternatives --remove name path。其中name與path與install中的一致,如果所刪除的連結組中還有其他連結的話,系統將會自動從其他中選擇一個priority高的連結作為預設為連結。

比如:update-alternatives –remove java /usr/lib/jvm/jre1.6.0_20/bin/java

4.4 alternatives新增版本

[root@localhost ~]# alternatives --install /usr/bin/python python \
/usr/local/python3/bin/python3.9 50
[root@localhost ~]# alternatives --install /usr/bin/python python \
/usr/bin/python2.7 30
[root@localhost ~]# alternatives --display python		#檢視Python版本
python - status is auto.					#自動模式,選擇許可權較高的
 link currently points to /usr/local/python3/bin/python3.9
/usr/local/python3/bin/python3.9 - priority 50
/usr/bin/python2.7 - priority 30
Current `best' version is /usr/local/python3/bin/python3.9.
[root@localhost ~]# ll /usr/bin/python
lrwxrwxrwx 1 root root 24 Nov  5 16:03 /usr/bin/python -> /etc/alternatives/python
[root@localhost ~]# ll /etc/alternatives/python
lrwxrwxrwx 1 root root 32 Nov  5 16:03 /etc/alternatives/python -> /usr/local/python3/bin/python3.9

4.5 alternatives切換版本

[root@localhost ~]# alternatives --config python		#設定版本

There are 2 programs which provide 'python'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/local/python3/bin/python3.9
   2           /usr/bin/python2.7

Enter to keep the current selection[+], or type selection number: 2	#選擇版本
[root@localhost ~]# alternatives --display python		#檢視當前版本
python - status is manual.
 link currently points to /usr/bin/python2.7
/usr/local/python3/bin/python3.9 - priority 50
/usr/bin/python2.7 - priority 30
Current `best' version is /usr/local/python3/bin/python3.9.
[root@localhost ~]# ll /usr/bin/python
lrwxrwxrwx 1 root root 24 Nov  5 16:11 /usr/bin/python -> /etc/alternatives/python
[root@localhost ~]# ll /etc/alternatives/python
lrwxrwxrwx 1 root root 18 Nov  5 16:11 /etc/alternatives/python -> /usr/bin/python2.7
[root@localhost ~]# alternatives --auto python			#自動選擇許可權最高的版本