pyenv的安裝和簡單使用(git、pyenv、pyenv-virtualenv)

pyenv的安裝和簡單使用(git、pyenv、pyenv-virtualenv)

Python工作環境管理

Python 2和Python 3之間存在着較大的差異,並且,由於各種原因導致了Python 2和Python 3的長期 共存。在實際工作過程中,我們可能會同時用到Python 2和Python 3,因此,需要經常在Python 2和 Python 3之間進行來回切換。此外,如果你是喜歡嚐鮮的人,那麼,你很有可能在Python新版本出來 的時候立即下載Python的版本,試驗Python的特性。

在Python世界裏,除了需要對Python的版本進行管理以外,還需要對不同的軟件包進行管理。大部分 情況下,對於開源的庫我們使用版本即可。但是,有時候可能需要對相同的Python版本,在不同的 項目中使用不同版本的軟件包。

在這一節裏,我們將介紹兩個工具,即pyenv和virtualenv。前者用於管理不同的Python版本,後者用 於管理不同的工作環境。有了這兩個工具,Python相關的版本問題將不再是問題。

1、問題情景

  1. Python解釋器版本混亂, 2和3差別巨大, 而且細分版本也不盡相同, 難以選擇和管理.
  2. 不同Linux發行版自帶Python不同, 如ubuntu16自帶2.7和3.5版本, 其中系統許多組件依賴於自帶解釋器, 一旦刪除或者更改都可能會造成系統出問題.
  3. 不同的Python解釋器軟件包管理也是問題, 如pip和ipython等必備包組件, 而且在項目開發中如何保證不同的包環境互不干擾也是一個問題.

那麼有沒有一個終極的解決辦法能在管理不同解釋器版本的同時控制不同的包環境呢? 有的, 就是pyenv.

2、使用pyenv管理不同的Python版本

安裝不同的Python版本並不是一件容易的事情,在不同的Python版本之間來回切換更加困難,而且, 多版本並存非常容易互相干擾。因此,我們需要一個名爲pyenv的工具。pyenv是一個Python版本管理 工具,它能夠進行全局的Python版本切換,也可以爲單個項目提供對應的Python版本。使用pyenv以 後,可以在服務器上安裝多個不同的Python版本,也可以安裝不同的Python實現。不同Python版本之 間的切換也非常簡單。接下來我們就一起看一下pyenv的安裝和使用。

3、pyenv是什麼? 能幹什麼?

pyenv是一個forked自ruby社區的簡單、低調、遵循UNIX哲學的Python環境管理工具, 它可以輕鬆切換全局解釋器版本, 同時結合vitualenv插件可以方便的管理對應的包源.

我們知道, 在terminal中輸入一個命令比如‘ls’時, shell會從當前環境的PATH中的各個目錄裏看是不是有ls這個可執行文件, 如果找到就執行, 否則就會報‘command no found’ 的錯誤, 同理, 只要控制PATH變量就能夠做到python版本的切換, pyenv通過在PATH頭部插入shims路徑來實現對python版本的控制.

pyenv的安裝和簡單使用(git、pyenv、pyenv-virtualenv)

pyenv和流行的pipenv、virtualenv的關係

pipenv是requests 作者 Kenneth Reitz大神寫的一個python虛擬環境管理工具, 結合了pip和virtualenv的功能, 側重點還是在包環境管理上, 使用思路是先創建一個指定python版本的環境, 然後在此環境上安裝相應的包, 好評不錯, 看到很多大牛都在推薦.

virtualenv是一個比較傳統成熟的虛擬環境管理工具了, 用的人也比較多, 思路也是創建虛擬環境, 然後安裝相應的包, 要進入環境就source一下activate腳本激活一下, 儘管成熟, 但是我個人不太喜歡用, 在部署項目的時候老是容易出現一些環境問題.

pyenv相對來說知名度就差很多了, 不過也很穩定, 這三個環境管理工具我都用過, 我個人更喜歡pyenv, 理由如下:

  • 相對於其他兩個工具, pyenv更側重在python 解釋器版本管理上, 比包管理更大一個層級, 使用pyenv我可以方便的下載指定版本的python解釋器, pypy, anaconda等, 可以隨時自由的在shell環境中本地、全局切換python解釋器
  • 開發的時候不需要限定某個版本的虛擬環境, 只需要在部署的時候用pyenv指定某個版本就好了
  • pyenv切換解釋器版本的時候, pip和ipython以及對應的包環境都是一起切換的, 所以如果你要同時運行ipython2.x和ipython3.x多個解釋器驗證一些代碼時就很方便
  • pyenv也可以創建好指定的虛擬環境, 但不需要指定具體目錄, 自由度更高, 使用也簡單

4、簡單使用

# 查看當前版本
pyenv version

# 查看所有版本
pyenv versions

# 查看所有可安裝的版本
pyenv install --list

# 安裝指定版本
pyenv install 3.6.5
# 安裝新版本後rehash一下
pyenv rehash

# 刪除指定版本
pyenv uninstall 3.5.2

# 指定全局版本
pyenv global 3.6.5

# 指定多個全局版本, 3版本優先
pyenv global 3.6.5 2.7.14

# 實際上當你切換版本後, 相應的pip和包倉庫都是會自動切換過去的

一、pyenv安裝

linux環境

版本 主機 環境
centos7.6 192.168.1.80 python3

1、安裝git

[root@python ~]# yum install git

2、開啓終端

本文使用 bash

3、安裝 pyenv

說明:本文的所有安裝都嚴格遵守官方文檔,與官方文檔完全保持一致。\

git 地址:https://github.com/pyenv/pyenv

在你的終端中執行如下命令,安全無毒,請放心食用:

首先把項目克隆下來,放在家目錄下的隱藏文件夾中:.pyenv

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

然後配置環境變量

如果你使用 bash,就依次執行如下命令:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc
如果你使用 zsh,就依次執行如下命令:
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.zshrc

echo 命令的含義是:將引號中內容寫入某文件中
請注意,以上的三條 echo 命令的最後一條長長的命令,請你保證它引號中的內容處於 ~/.bashrc 或者 ~/.zshrc 的最底部。
因爲在 pyenv 初始化期間會操作 path 環境變量,導致不可預測的行爲。
查看文件的底部內容,可以使用 tail 命令,用法:tail ~/.bashrc 或者 tail ~/.zshrc,編輯文件可以使用 vim 或者 vscode

最後,在使用 pyenv 之前,重新初始化 shell 環境,執行如下命令

exec $SHELL

不執行該命令也是完全可以的,你可以關閉當前的終端窗口,重新啓動一個就可以了。

此時,你已經完成了 pyenv 的安裝了,你使用可以它的全部命令了,但是我建議你先別急着用,一口氣裝完 pyenv 的一個插件,那就是 pyenv-virtualenv

4、安裝 pyenv-virtualenv

virtualenv本身是一個獨立的項目,用以隔離不同項目的工作環境。例如,用戶lmx希望在項目A中使用 Flask 0.8這個版本,與此同時,又想在項目B中使用Flask 0.9這個版本。如果我們全局安裝Flask,必然 無法滿足用戶的需求。這個時候,我們就可以使用virtualenv。

讀者需要注意pyenv和virtualenv的區別。pyenv用以管理不同的Python版本,例如,你的系統工作時 使用Python 2.7.13,學習時使用Python 3.6.0。virtualenv用以隔離項目的工作環境,例如,項目A和 項目B都是使用Python 2.7.13,但是,項目A需要使用Flask 0.8版本,項目B需要使用Flask 0.9版本。我 們只要組合pyenv和virtualenv這兩個工具,就能夠構造Python和第三方庫的任意版本組合,擁有很好 的靈活性,也避免了項目之間的相互干擾。

virtualenv本身是一個獨立的工具,用戶可以不使用pyenv而單獨使用virtualenv。但是,如果你使用了 pyenv,就需要安裝pyenv-virtualenv插件,而不是通過virtualenv軟件使用virtualenv的功能。

git 地址:https://github.com/pyenv/pyenv-virtualenv

(1) 把插件克隆在剛纔已經安裝完畢的 pyenv 的 plugins 文件夾中

git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv

(2) 然後配置環境變量

如果你使用 bash,就執行如下命令:
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
如果你使用 zsh,就執行如下命令:
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.zshrc

(3) 最後,在使用 pyenv 之前,重新初始化 shell 環境,執行如下命令

exec $SHELL

不執行該命令也是完全可以的,你可以關閉當前的終端窗口,重新啓動一個就可以了。

至此,pyenv就安裝完成了,我們可以通過下面的命令驗證pyenv是否正確安裝並獲取pyenv的幫助信息:

[root@python ~]# pyenv --help
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
   commands    List all available pyenv commands
   exec        Run an executable with the selected Python version
   global      Set or show the global Python version(s)
   help        Display help for a command
   hooks       List hook scripts for a given pyenv command
   init        Configure the shell environment for pyenv
   install     Install a Python version using python-build
   local       Set or show the local application-specific Python version(s)
   prefix      Display prefix for a Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   root        Display the root directory where versions and shims are kept
   shell       Set or show the shell-specific Python version
   shims       List existing pyenv shims
   uninstall   Uninstall a specific Python version
   version     Show the current Python version(s) and its origin
   --version   Display the version of pyenv
   version-file   Detect the file that sets the current pyenv version
   version-name   Show the current Python version
   version-origin   Explain how the current Python version is set
   versions    List all Python versions available to pyenv
   whence      List all Python versions that contain the given executable
   which       Display the full path to an executable

See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme

二、使用 pyenv

此處僅僅展示 pyenv 和 virtualenv 的日常用法\

1、檢查安裝是否正確

檢查 pyenv 的版本
[root@python ~]# pyenv version
(set by /root/.pyenv/version)
查看 pyenv 已經管理了哪些 python 版本
[root@python ~]#pyenv versions
* system (set by /root/.pyenv/version)

如果你看到了正常的版本信息,就說明可以了,如果看到了類似於 command not found 之類的,就說明安裝失敗了。

我們通過pyenv的install命令,可以查看pyenv當前支持哪些Python版本,如下所示:

[root@python ~]# pyenv install --list 
Available versions:
2.1.3
……省略部分信息
3.8.0
3.8-dev
3.8.1
3.9-dev
……省略部分信息
anaconda3-2018.12
anaconda3-2019.03
anaconda3-2019.07
anaconda3-2019.10
……省略部分信息
[root@python ~]#

2、pyenv切換python版本

由於pyenv可以安裝的Python版本列表非常長,所以,這裏進行了省略。讀者可以在自己電腦上安裝 pyenv,然後執行pyenv install --list命令進行查看。可以看到,pyenv不但可以安裝不同的Python版 本,而且還可以安裝不同的Python實現,也可以安裝版本的Python用以學習。

查看當前系統中包含的Python版本:

[root@python ~]# pyenv versions 
* system (set by /root/.pyenv/version)
使用pyenv安裝不同的Python版本:
[root@python ~]#pyenv install -v 3.8.1  
[root@python ~]#pyenv install -v 2.7.13 
再次查看當前系統中包含的Python版本
[root@python ~]# pyenv versions
* system (set by /root/.pyenv/version)
  2.7.13
  3.8.1

切換版本

#切換前爲3.8.1
[root@python ~]# python
Python 3.8.1 (default, Apr 20 2020, 15:00:10) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

#切換爲2.7.13
[root@python ~]# pyenv  global 2.7.13 
[root@python ~]# python
Python 2.7.13 (default, Apr 20 2020, 15:04:15) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

使用pyenv以後,可以快速切換Python的版本。切換Python版本以後,與版本相關的依賴也會一起切 換。因此,我們不用擔心不同的版本在系統中是否會相互干擾。例如,切換Python版本以後,相應的 pip也會跟着切換,所以不用擔心自己使用的pip版本和Python版本不匹配的問題,如下所示:

[root@python ~]# pyenv  global 3.8.1
[root@python ~]# pip --version
pip 19.2.3 from /root/.pyenv/versions/3.8.1/lib/python3.8/site-packages/pip (python 3.8)
如果想要刪除Python版本,使用uninstall命令即可。如下所示:
[root@python ~]# pyenv uninstall 2.7.10

三、pyenv-virtualenv的使用

有了pyenv-virtualenv以後,我們可以爲同一個Python解釋器,創建多個不同的工作環境。例如,我們 新建兩個工作環境:

[root@python ~]# pyenv virtualenv 3.8.1 first_project 
[root@python ~]# pyenv virtualenv 3.8.1 second_projec
可以使用virtualenvs子命令查看工作環境
[root@python ~]# pyenv virtualenvs
  3.8.1/envs/first_project (created from /root/.pyenv/versions/3.8.1)
  3.8.1/envs/second_projec (created from /root/.pyenv/versions/3.8.1)
  first_project (created from /root/.pyenv/versions/3.8.1)
  second_projec (created from /root/.pyenv/versions/3.8.1)

創建完工作環境以後,可以通過activate和deactivate子命令進入或退出一個工作環境。進入工作環境 以後,左邊的提示符會顯示你當前所在的工作環境,以免因爲環境太多導致操作錯誤。

(first_project) [root@python ~]# pip install flask==1.1.1 
Looking in indexes: https://pypi.doubanio.com/simple
Collecting flask==1.1.1
  Downloading https://pypi.doubanio.com/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl (94kB)
     |███▌                            | 10kB 28.0MB/s eta 0:00:
     |███████                         | 20kB 1.8MB/s eta 0:00:0
     |██████████▍                     | 30kB 2.7MB/s eta 0:00:0
     |█████████████▉                  | 40kB 1.8MB/s eta 0:00:0
     |█████████████████▍              | 51kB 1.3MB/s eta 0:00:0
     |████████████████████▉           | 61kB 1.5MB/s eta 0:00:0
     |████████████████████████▎       | 71kB 1.4MB/s eta 0:00:0
     |███████████████████████████▊    | 81kB 1.3MB/s eta 0:00:0
     |███████████████████████████████▏| 92kB 1.4MB/s eta 0:00:0
     |████████████████████████████████| 102kB 1.6MB/s 
Collecting itsdangerous>=0.24 (from flask==1.1.1)
(first_project) [root@python ~]# pyenv deactivate
##退出first_project環境
[root@python ~]# 

接下來,我們看一下在不同的工作環境安裝不同的Flask版本

[root@python ~]# pyenv activate first_project 
##切換工作環境
(first_project) [root@python ~]# pip install flask==1.1.1 
##安裝1.1.1的flask
(first_project) [root@python ~]# pyenv deactivate 
##退出目前工作環境
[root@python ~]#

[root@python ~]# pyenv activate second_projec
##切換工作環境
(second_project) [root@python ~]# pip install flask==0.10.1
##安裝0.10.1的flask
(second_project) [root@python ~]# pyenv deactivate 
##退出目前工作環境
[root@python ~]#
查看一下兩個工作環境源目錄

pyenv的安裝和簡單使用(git、pyenv、pyenv-virtualenv)

如果想要刪除虛擬環境,則使用:

(first_project) [root@python ~]# pyenv virtualenv-delete first_project 

使用pyenv和python-virtualenv插件,我們就能夠自由地在不同的版本之間進行切換,相比管理Python 版本,不但節省了時間,也避免了工作過程中的相互干擾。

三、更新 pyenv

由於我們是 git 克隆的,所以更新非常簡單

cd ~/.pyenv` 或者 `cd $(pyenv root)`
 `git pull

四、卸載 pyenv

由於 pyenv 把一切都放在 ~/.pyenv 下了,所以卸載很方便,兩個步驟就行了

首先你需要刪除環境變量

然後你需要執行:

rm -rf ~/.pyenv` 或者 `rm -rf $(pyenv root)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章