1. 程式人生 > >利用pipenv和pyenv管理多個相互獨立的Python虛擬開發環境

利用pipenv和pyenv管理多個相互獨立的Python虛擬開發環境

我們經常會遇到這樣的開發需求,比如你手頭有多個開發專案,其中專案A和專案B要求用python3,專案C需要用python2,而專案A和專案B又要求第三方依賴包相互獨立,互不干擾。
為了滿足這樣的開發需求,我們需要在自己的電腦上安裝多個Python版本,並且專案之間進行環境隔離。
要想安裝多個Python版本,可以利用pyenv這個好用的工具,對於建立多個專案之間隔離的開發環境(就是虛擬環境啦),可以藉助於pipenv這個更加好用的工具。

今天我們來介紹如何利用pyenvpipenv來管理我們的python開發環境。根據這篇文章的介紹,你將能夠:

  • 在同一臺電腦上管理多個Python版本
  • 為每一個專案建立相互隔絕的虛擬環境

1、用pyenv安裝多個Python版本

pyenv是Python版本管理工具,利用它我們可以在同一臺電腦上安裝多個版本的Python,這個過程非常簡單。

1.1、安裝或升級pyenv

首先安裝pyenv,如果你是Mac電腦,那麼推薦使用Homebrew來安裝。

$ brew update
$ brew install pyenv
$ brew upgrade pyenv

對於github安裝的pyenv,可以執行:

$ pyenv update

1.2、用pyenv安裝Python

安裝完pyenv,安裝Python就簡單了。我電腦上系統自帶的是Python2.7.10,我準備再安裝一個Python2.7.14和Python3.6.4,以後開發時候就用自己安裝的Python2.7.14或者Python3.6.4了。

$ pyenv install 3.6.4 2.7.24 
$ pyenv rehash

執行命令pyenv versions,如果輸出結果如下,那麼說明我們已經安裝好了Python2.7.14和Python3.6.4:

$ pyenv versions
  system
* 2.7.14 (set by /Users/chunming.liu/.pyenv/version)
* 3.6.4 (set by /Users/chunming.liu/.pyenv/version)

現在我們就可使用Python2.7.14和Python3.6.4了。執行這個下面python2、python3、python指令看看:

$ python2
Python 2.7.14 (default, Mar 16 2018, 10:31:53) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
$ python3
Python 3.6.4 (default, Mar 16 2018, 10:42:40) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
$ python
Python 3.6.4 (default, Mar 16 2018, 10:42:40) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.38)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

看到上面的輸出,就表示安裝ok了。這樣,我們系統上就有Python2.7.14和Python3.6.4了。
我們可以通過pyenv global或者pyenv local切換Python版本:

lcm:~ chunming.liu$ pyenv global 3.6.4
lcm:~ chunming.liu$ pyenv versions
  system
  2.7.14
* 3.6.4 (set by /Users/chunming.liu/.pyenv/version)

pyenv global屬於全域性切換,pyenv local屬於區域性切換,區域性切換隻在所在切換時的目錄中生效。
不過有了pipenv,我們不用手動切換Python版本了。

接下來我們就來開始為每個專案專案建立獨立的開發環境。

2、用pipenv安裝相互獨立的虛擬環境

pipenv是Python官方推薦的包管理工具。 它綜合了 virtualenv , pip 和 pyenv 三者的功能。能夠自動為專案建立和管理虛擬環境。
pipenv使用 Pipfile 和 Pipfile.lock 來管理依賴包,並且在使用pipenv新增或刪除包時,自動維護 Pipfile 檔案,同時生成 Pipfile.lock 來鎖定安裝包的版本和依賴資訊,避免構建錯誤。相比pip需要手動維護requirements.txt 中的安裝包和版本,具有很大的進步。

2.1、安裝pipenv

如果你是Mac電腦,那麼推薦使用Homebrew來安裝。

$ brew install pipenv

如果不是Mac電腦,建議 使用Python3的pip3 安裝:

$ pip3 install pipenv

執行pipenv,可以檢視pipenv的幫助資訊:

pipenv

2.2、為專案建立虛擬環境

我們希望在每個專案的根目錄下儲存虛擬環境目錄(.venv),需要在 .bashrc 或 .bash_profile 中配置如下:

export PIPENV_VENV_IN_PROJECT=1

要想使配置生效,執行下source ~/.bashrc或者source ~/.bash_profile。
接下來我們為專案建立虛擬環境。

$ mkdir pipenv_demo
$ cd pipenv_demo
$ pipenv --three # 初始化一個python3虛擬環境,如果想初始化pyhton2的虛擬環境,則使用pipenv --two

建立完虛擬環境之後,在pipenv_demo目錄下將會看到一個.venv的目錄,這個目錄就是pipenv_demo專案的虛擬環境。使用具體的python版本建立虛擬環境,可以執行:

pipenv --python 2.7.14

2.3、為專案安裝第三方依賴包

為專案安裝自己的依賴包到虛擬環境中,使每個專案擁有相互獨立的第三方包,是非常不錯的Python的開發實踐。安裝依賴包到虛擬環境中:

$ pipenv install flask
$ pipenv install pytest --dev   # 用於區分需要部署到線上的開發包、只需要在測試環境中執行的包

執行完上面的命令後,檢查一下是否安裝成功:

$ pipenv graph
Flask==0.12.2
  - click [required: >=2.0, installed: 6.7]
  - itsdangerous [required: >=0.21, installed: 0.24]
  - Jinja2 [required: >=2.4, installed: 2.10]
    - MarkupSafe [required: >=0.23, installed: 1.0]
  - Werkzeug [required: >=0.7, installed: 0.14.1]
pytest==3.4.2
  - attrs [required: >=17.2.0, installed: 17.4.0]
  - pluggy [required: >=0.5,<0.7, installed: 0.6.0]
  - py [required: >=1.5.0, installed: 1.5.2]
  - setuptools [required: Any, installed: 38.6.0]
  - six [required: >=1.10.0, installed: 1.11.0]

可看到已經安裝了Flask和pytest,還列出了他們的依賴包。
這是觀察專案的根目錄下,生成了兩個檔案,分別是Pipfile和Pipfile.lock。這兩個檔案記錄了此專案的第三方依賴包,這兩個檔案的區別是 Pipfile中安裝的包不包含包的具體版本號,而Pipfile.lock是包含包的具體的版本號的。

2.4 更新 pypi源來提高依賴庫安裝的速度

在使用pipenv的時候,常常會在安裝的時候,一直卡在了 Locking 這裡,通過加上 -v 引數,可以看到安裝過程中的步驟資訊,卡在了下載那裡,這時應該可以意識到是因為網路的原因,pipenv建立的 Pipfile 中預設的pypi源是python官方的 https://pypi.python.org/simple。我們國內使用者訪問下載的時候會很慢。

所以,我一般會在建立好Pipfile以後,修改到檔案中 source 塊下的 url 欄位,設定為國內的 pypi 源就好了,我推薦的是清華的pypi源或者阿里源,具體設定如下:

[[source]]
 url = "https://pypi.tuna.tsinghua.edu.cn/simple"
 verify_ssl = true
 name = "pypi"

3、使用虛擬環境進行開發

虛擬環境建立好了之後,就可以在裡面進行開發了。
如果在命令列下開發,則在專案目錄下執行pipenv shell,就進入到了虛擬環境中,在這個環境中,就已經包含安裝過的所有第三方依賴包了,接下來就可以利用這些第三方包進行開發工作了。
如果是用Pycharm進行開發,就更簡單了,直接用Pycharm開啟專案目錄就好了,開啟後可以從Pycharm中的左側導航欄裡面看到External Libraries裡面顯示的是虛擬環境中的Python直譯器。

4、刪除安裝的第三方包

如果是要刪除虛擬環境中的第三方包,執行

pipenv uninstall flask

5、安裝專案所有的依賴

用git管理專案時候,要把Pipfile和Pipfile.lock加入版本跟蹤。這樣clone了這個專案的同學,只需要執行

$ pipenv install

就可以安裝所有的Pipfile中 [packages]部分的包了,並且自動為專案在自己電腦上建立了虛擬環境。
如果是想要安裝[dev-packages]部分的包,需要執行:

$ pipenv install -d

上面的方法都是安裝Pipfile中列出來的第三方包的最新版本,如果是想安裝Pipfile.lock中固定版本的第三方依賴包,需要執行:

$ pipenv install --ignore-pipfile

如果你的專案之前使用requirements.txt來管理依賴的,那麼使用pipenv安裝所有依賴可以採用類似pip的方法:

$ pipenv install -r path/to/requirements.txt

6、團隊實踐建議

建議團隊內開發人員,在自己電腦上都安裝pyenv和pipenv。Pipfile和Pipfile.lock加入版本跟蹤,.venv不要加入版本管理。為自己的每一個專案建立獨立的虛擬環境。