附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 //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 //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常見參數
參考鏈接://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 #自動選擇權限最高的版本