天天看點

pyenv虛拟環境管理

一. pyenv 簡單介紹

在日常運維中, 經常遇到這樣的情況: 系統自帶的 Python 是 2.x,而業務部署需要 Python 3.x 環境, 此時需要在系統中安裝多個 Python 版本,但又不能影響系統自帶的 Python 版本,即需要實作 Python 的多版本環境共存, pyenv 就是這樣一個 Python 版本管理器, 可以同時管理多個 python 版本共存! 簡單的說,pyenv 可以根據需求使使用者在系統裡安裝和管理多個 Python 版本:

  • 配置目前使用者的 python 的版本;
  • 配置目前 shell 的 python 版本;
  • 配置某個項目(目錄及子目錄)的 python 版本;
  • 配置多個虛拟環境.

由于 python 的各種優點,目前學習及使用 python 的人越來越多, 學習 python有一個不容忽視的問題就是 python 的版本問題! 到現在為止,python 的版本有很多,但是問題在于 python2 與 python3 的差別。python3 的對一些子產品進行了改變,導緻了 python2 寫的代碼有的不被 python3 相容,進而導緻程式運作報錯。是以,在學習和工作中使用 python 的時候,最好是安裝一個 pyenv 管理器, 多安裝幾個 python 版本進行管理, 然後再針對不同項目安裝各自項目的 python 虛拟環境, 互相隔離, 這樣便于使用和管理。

二. pyenv 工作原理

pyenv 是利用系統環境變量 PATH 的優先級,劫持 python 的指令到 pyenv上,根據使用者所在的環境或目錄,使用不同版本的 python

how it works:
At a high level, pyenv intercepts Python commands using shim executables injected into your PATH, determines which Python version
has been specified by your application, and passes your commands along to the correct Python installation.
           

它是如何工作的:

在較進階别上,pyenv 使用注入到 PATH 中的 shim 可執行檔案攔截 Python 指令,确定應用程式指定了哪個 Python 版本,并将指令傳遞到正确的 Python 安裝。

對于系統環境變量 PATH ,裡面包含了一串由冒号分隔的路徑,例如 /usr/local/bin:/usr/bin:/bin。每當在系統中執行一個指令時,例如 python 或 pip,作業系統就會在 PATH 的所有路徑中從左至右依次尋找對應的指令。因為是依次尋找,是以排在左邊的路徑具有更高的優先級。在 PATH 最前面插入一個 ( p y e n v r o o t ) / s h i m s 目 錄 , (pyenv root)/shims 目錄, (pyenvroot)/shims目錄,(pyenv root)/shims 目錄裡包含名稱為 python 以及 pip 等可執行腳本檔案;當使用者執行 python 或 pip 指令時,根據查找優先級,系統會優先執行 shims 目錄中的同名腳本。pyenv 正是通過這些腳本,來靈活地切換至我們所需的 Python 版本。

三. pyenv 安裝和使用說明

1) pyenv 安裝

(1) 安裝依賴環境

yum -y install gcc zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel git
           

(2) 安裝 pyenv 包

以下步驟如果出現

Permission denied

,說明需要root權限,請切換到root權限執行

方式一:推薦采用The automatic installer的方式安裝,可以一鍵安裝pyenv的所有插件。

curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
           

方式二:腳本安裝

擷取腳本:留言免費提供

執行腳本進行安裝(執行前授予755權限)

# chmod 755 pyenv-installer
# /bin/bash pyenv-installer
           

安裝完成後可以看到如下提示

WARNING: seems you still have not added 'pyenv' to the load path.

# Load pyenv automatically by adding
# the following to ~/.bashrc:

export PATH="/home/fatpuffer/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
           

在 ~/.bashrc 檔案底部添加下面三行内容, 讓系統可以找到 pyenv 安裝的 Python

export PATH="/home/fatpuffer/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
           

使上面配置生效

[[email protected] ~]# source ~/.bashrc
           

檢視 pyenv 安裝情況

[[email protected] ~]# pyenv --version            // 或者"pyenv -v"
pyenv 1.2.14
           

更新 pyenv

[[email protected] ~]# pyenv update
           

(3) 解除安裝 pyenv

先删除 pyenv 的安裝目錄, 這裡即是

/home/fatpuffer/.pyenv

[[email protected] ~]# rm -fr /home/fatpuffer/.pyenv
           

接着删除~/.bashrc裡面配置的系統環境變量

export PATH="/home/fatpuffer/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
           

最後使其生效

[[email protected] ~]# source ~/.bashrc
           

2) pyenv 使用

目前系統預設的 Python 版本

[[email protected] ~]$ python -V
Python 2.7.5
           

檢視目前 pyenv 可檢測到的所有版本,處于激活狀态的版本前以 * 标示

[[email protected] ~]$ pyenv versions
* system (set by /home/fatpuffer/.pyenv/version)
           

pyenv預設使用github鏡像源,是以我們安裝起來很慢,可以使用如下指令進行安裝(隻需要更換版本号即可)

v=3.7.2;wget http://npm.taobao.org/mirrors/python/$v/Python-$v.tar.xz -P ~/.pyenv/cache/;pyenv install $v 
           

使用 pyenv install 安裝 python,可以使用 -v 參數,檢視安裝過程。如下, 分别安裝兩個版本的 python

[[email protected] ~]# pyenv install -v 3.6.5
[[email protected] ~]# pyenv install -v 3.7.2
           

檢視目前 pyenv 可檢測到的 python 版本 (即 pyenv 目前安裝了哪些 python 版本)

[[email protected] ~]# pyenv versions
* system (set by /home/fatpuffer/.pyenv/version)
  3.6.5
  3.7.2
           

檢視目前 pyenv 使用的python 版本 (注意是version, 而不是上面的versions)

[[email protected] ~]$ pyenv version
system (set by /home/fatpuffer/.pyenv/version)
           

配置及管理 python 版本

pyenv 管理 python 版本的三個基礎指令(即使用下面三個指令的途徑進行python 版本的切換和激活狀态):

pyenv global

// 配置目前使用者的系統使用的 python 版本. 可以使用這個指令進行python版本的切換!

pyenv shelll

// 配置目前 shell 的 python 版本,退出 shell 則失效

pyenv local

// 配置所在項目(目錄)的 python 版本

特别注意:

在使用上面 pyenv 三個基礎指令進行 python 版本切換後,如果想要切回到系統預設的 python 版本, 也就是這裡預設的 python2.7.5, 則需要下面指令進行切回操作!!!

[[email protected] p_b]# pyenv local system
[[email protected] p_b]# python -V      
Python 2.7.5
           

下面分别介紹下 pyenv 這三個基礎指令切換 python 版本的操作

a)

使用 pyenv global 配置目前使用者的

系統

使用的 python 版本

[[email protected] ~]# pyenv versions
* system (set by /home/fatpuffer/.pyenv/version)
  3.6.5
  3.7.2

[[email protected] ~]# python -V
Python 2.7.5
           

使用下面指令進行 python 版本的切換

[[email protected] ~]# pyenv global 3.6.5

[[email protected] ~]# pyenv versions
  system
  3.7.2
* 3.6.5 (set by /home/fatpuffer/.pyenv/version)

[[email protected] ~]# python -V
Python 2.7.5  # 竟然沒有切換到3.6.5版本
           

需要執行下面指令進行資料庫更新後, pyenv 切換的 python 版本才會生效!

[[email protected] ~]# pyenv rehash

[[email protected] ~]# python -V      
Python 3.6.5

[[email protected] ~]# which python
/home/fatpuffer/.pyenv/shims/python
           

特别注意:如果使用"pyenv global xxx" 以及 “pyenv rehash” 後仍然無法成功切換版本 !這種情況一般是因為用 pyenv 指定了 local 版本!!

解決辦法:取消設定 local 版本,即執行"pyenv local --unset"即可!

b)

使用 pyenv shelll 配置目前

shell 視窗

的 python 版本,退出 shell 則失效

[[email protected] ~]# python -V
Python 3.6.5

[[email protected] ~]# pyenv versions
  system
  3.7.2
* 3.6.5 (set by /home/fatpuffer/.pyenv/version)

[[email protected] ~]# pyenv shell 3.7.2

[[email protected] ~]# python -V     
Python 3.7.2
           

如上設定後, 隻在目前 shell 終端視窗有效, 退出重新登入 或 再打開另外一個視窗就不生效了 (即 python 版本還是之前的)即使執行"pyenv rehash" 進行更新操作, 在别的 shell 視窗也是不生效的!

目前 shell 下,取 消配置的使用 pyenv shell --unset;若退出此 shell,配置也會失效。

[[email protected] ~]# pyenv shell --unset
[[email protected] ~]# python -V       
Python 3.6.5
           

c)

使用 pyenv local 配置所在項目(

目前目錄

)的 python 版本

建立一個檔案夾 ~/project,在此檔案夾下使用 python local

[[email protected] ~]# python -V 
Python 3.7.2
[[email protected] ~]# mkdir project
[[email protected] ~]# cd project/
[[email protected] project]# pyenv local 3.6.5
[[email protected] project]# pyenv versions
  system
* 3.6.5  (set by /home/fatpuffer/project/.python-version)
  3.7.2
           

在目前項目目錄下檢視 python 版本

[[email protected] project]# python -V
Python 3.6.5
           

建立目錄 ~/project/p1,切換到 ~/project/p1,并檢視版本

[[email protected] project]# mkdir p1 && cd p1
[[email protected] p1]# python -V
Python 3.6.5
           

如上可知, 第三種指令操作後, 切換的 python 版本隻能在目前所在項目目錄下生效!在其他目錄下就不會生效了!!

如果要想解除安裝掉 pyenv 安裝的 python 版本, 就使用"pyenv uninstall " 指令

[[email protected] ~]# pyenv versions
  system
  3.6.5
* 3.7.2 (set by /home/fatpuffer/.pyenv/version)

[[email protected] ~]# pyenv uninstall 3.6.5
pyenv: remove /home/fatpuffer/.pyenv/versions/3.6.5? y

[[email protected] ~]# pyenv versions   
  system
* 3.7.2 (set by /home/fatpuffer/.pyenv/version)
           

四. python 虛拟環境部署

為了對不同的項目進行隔離,使每個項目使用獨立的 python 解釋器及依賴,需要配置 python 虛拟環境。每個項目都有一個單獨的 python 虛拟環境, 這樣項目之前的 python 環境互相隔離, 便于使用和管理!

[[email protected] ~]# pyenv versions    
  system
  3.7.2
* 3.6.5 (set by /home/fatpuffer/.pyenv/version)
           

上面使用 pyenv install 安裝的 python 版本,比如 3.6.5

python3.6.1 解釋器安裝的路徑為

/home/fatpuffer/.pyenv/versions/3.6.5
           

插件的安裝的路徑為

/home/fatpuffer/.pyenv/versions/3.6.1/lib/python3.6/site-packages
           

使用 pyenv-virtualenv 建立 python 虛拟環境,實質上是在

/home/fatpuffer/.pyenv/versions/3.6.5/

下建立一個檔案夾 evns,存放該虛拟環境 python的解釋器;并且在 ~/.pyenv/ 下建立一個軟連接配接,該虛拟環境可以通過 pyenv 進行管理;

建立

比如建立某個項目的 python 虛拟環境, 虛拟環境的指令為

puffer_env

(名稱随便起), 該虛拟環境的 python 版本是2.7.5

[[email protected] ~]# pyenv virtualenv 2.7.5 puffer_env
           

檢視, 發現在 /home/fatpuffer/.pyenv/versions 目錄下會有一個 kevin_py 虛拟環境的軟連接配接

[[email protected] ~]# ll ~/.pyenv/versions/
total 8
drwxr-xr-x 7 root root 4096 Oct 26 11:53 3.7.2
drwxr-xr-x 6 root root 4096 Oct 26 15:57 3.6.5
lrwxrwxrwx 1 root root   41 Oct 26 16:33 puffer_env -> /home/fatpuffer/.pyenv/versions/2.7.5/envs/puffer_env
           

檢視 python 虛拟環境

[[email protected] ~]# pyenv virtualenvs
  2.7.5/envs/puffer_env (created from /home/fatpuffer/.pyenv/versions/2.7.5)
  puffer_env (created from /home/fatpuffer/.pyenv/versions/2.7.5)
           

切換

有四種方法用于切換到 python 虛拟環境

方法一 (推薦這一個切換方法)

[[email protected] ~]# pyenv activate puffer_env 
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
(puffer_env ) [[email protected] ~]#
           

方法二 (這種切換方法也推薦)

[[email protected] ~]# source activate puffer_env 
pyenv-virtualenv: activate puffer_env 
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
(puffer_env) [[email protected] ~]# python -V
Python 2.7.5
(puffer_env) [[email protected] ~]#
           

方法三

[[email protected] ~]# source /home/fatpuffer/.pyenv/versions/2.7.5/envs/puffer_env/bin/activate puffer_env 
(puffer_env)[[email protected] ~]#
           

方法四

[[email protected] ~]# pyenv shell puffer_env
(puffer_env)[[email protected] ~]#
           

退出

兩種退出虛拟環境方法

方法一:

(puffer_env)[[email protected] ~]#  source deactivate
[[email protected] ~]#
           

‘方法二:

(puffer_env)[[email protected] ~]#  pyenv deactivate
[[email protected] ~]#
           

删除

删除虛拟環境

[[email protected] ~]# pyenv virtualenv-delete puffer_env
           

官方安裝教程

安裝pyenv

安裝pipenv

繼續閱讀