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