附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工作原理

  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			#自動選擇權限最高的版本

    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章