附001.Python多版本環境管理
一 環境背景
由於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工作原理
- pyenv安裝後會在系統PATH中插入shims路徑,每次執行Python相關的可執行檔案時,會優先在shims裡查詢Python路徑~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin;
- 系統選擇Python版本,依如下順序選擇Python版本:
- Shell變數設定(執行pyenv shell檢視)
- 當前可執行檔案目錄下的.python_version檔案裡的版本號(執行pyenv shell檢視)
- 上層目錄查詢找到的第一次.pyenv-version檔案
- 全域性的版本號在~/.pyenv/version檔案內(執行pyenv shell檢視)
- 確定版本檔案的位置和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 #檢視版本
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 #檢視版本
提示:手動安裝和自動擋安裝任選其一即可。
自動安裝可能出現環境變數未新增的情況,可參考手動安裝進行新增。
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
#切換當前目錄的Python版本,通過將版本號寫入當前目錄下的.python-version檔案的方式。通過這種方式設定的 Python版本優先順序較global高。
[root@localhost tmp]# pyenv global 3.6.5
#設定全域性的Python版本,通過將版本號寫入~/.pyenv/version檔案的方式。
2.5 pyenv常見引數
常用命令參考連結:https://github.com/pyenv/pyenv#installation
三 Virtualenv部署與使用
3.1 Virtualenv簡介
Virtualenv試試一個用來為一個應用建立一套“隔離”的Python執行環境,使得每個應用擁有一套“獨立”的Python執行環境。Virtualenv通過建立一個虛擬化的python執行環境,將我們所需的依賴安裝進去的,不同專案之間相互不干擾。特點:
- 在沒有許可權的情況下安裝新套件
- 不同應用可以使用不同的套件版本
- 套件升級不影響其他應用
3.2 Virtualenv安裝部署
[root@localhost ~]# pip install virtualenv
提示: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 #自動選擇許可權最高的版本