附001.Python多版本環境管理

木二發表於2022-05-29

一 環境背景

由於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			#自動選擇許可權最高的版本

    相關文章