Pipenv 更簡單、更快速的 Python 套件管理工具
以往當我們有兩個專案,一個專案使用 Flask 0.11,另一個使用 Flask 0.12,我們會使用 virtualenv 創建一個虛擬的 Python 環境,然後透過 pip 以及 requirements.txt 去管理套件的版本。
使用 virtualenv & requirements.txt 確實解決了一些套件管理問題,也可以讓別人也可以快速安裝專案所需要的套件,然而維護更新 requirements.txt 卻是一件麻煩的事情,需要透過手動來維護,不僅如此,當我們套件有分 development & production 不同的套件時,我們可能還需要特定有個 requirements-dev.txt 來區分兩個不同環境的套件。
相較之下,pipenv 則是目前 Python 官方所推薦的套件管理工具,pipenv 除了解決上述的問題,也整合了 virtualenv 的功能,亦即從此以後,你只需要一個 pipenv 下幾個指令就可以輕鬆解決 Python 套件管理的問題,專注於開發上面就好。
pipenv 主要提供了以下的特點:
- 只需要 pipenv,不需要再分別使用
pip
跟virtualenv
。 - 自動產生與更新
Pipfile
andPipfile.lock
解決了維護 requirements.txt 的問題。 - 透過套件的 Hash 安全性檢查確認 (當安裝套件 hash 值不同時,跳出錯誤,防止惡意套件侵入)
- 產生 dependency 的樹狀圖 (e.g.
$ pipenv graph
). - 可以透過
.env
自動載入不同環境變數。
另外還有幾個明顯的好處是,相較 pip 是按順序安裝, pipenv 是使用並行(parallel)同步安裝套件,能夠提升安裝套件的速度,且Pipfile
預設也區分了 development 與 production 環境。
如何使用 Pipenv?
Pipenv 安裝上非常簡單
首先透過 pip 安裝 Pipenv (也可以使用 Homebrew)
$ pip install pipenv
常用指令
- 在專案目錄下,建立 Py3 or Py2 虛擬環境:
$ pipenv --three // 產生 Python 3 虛擬環境
$ pipenv --two // 產生 Python 2 虛擬環境
如果跳出 ValueError: unknown locale: UTF-8 相關錯誤,表示系統需要設定 LANG 環境變數 e.g.
export LANG=en_US.UTF-8 // ~/.bashrc or ~/.zshrc
- 安裝套件:
$ pipenv install requests
$ pipenv install pytest --dev // development 環境
此時,若目錄下無 Pipfile,Pipenv 會自動產生一個 Pipfile,用來記錄所安裝的套件,內容如下:
[[source]]url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"[packages]request = "*"[dev-packages][requires]python_version = "3.6"
除此之外還會自動產生一個帶有 hash 資訊的 Pipfile.lock 的檔案,:
{
"_meta": {
"hash": {
"sha256": "dd421b2e6b841932b6c38ee7420c72bab79acd8ef6497cdeeca715990674c5bd"
},
.....
},
"default": {
"get": {
"hashes": [
"sha256:40e0ab2d6eca5ddd4f9d80055f2c6caa5e9fb51922d5e1c4b69a872fb363be98"
],
"version": "==0.0.39"
},
"post": {
"hashes": [
"sha256:c1650baa3bf0653ae7a803cff1314021b04e4f9c121e59d417a57f77cab975d9"
],
"version": "==0.0.26"
},
"public": {
"hashes": [
"sha256:0e3cc5ad2aee017b32184a8356030997053e3a5a3cae5474620af8f77fef886e"
],
"version": "==0.0.65"
},
"query-string": {
"hashes": [
"sha256:3a6950785aa2b0d426d8743f2c3c705c57bffc8b03dc05a68520d4779ab7ea68"
],
"version": "==0.0.28"
},
"request": {
"hashes": [
"sha256:14e01d875a04530e96b2ceece734670d749fb1b96b85089abc86e3d4198dc9cd"
],
"version": "==0.0.26"
}
},
"develop": {}
}
可以從上面看到除了 request 之外,它同時記錄 request 所需相依套件的版本,這是用來確保在任何地方透過這份檔案安裝套件都是相同的套件(相較之外 requirements.txt 則無法確保所安裝的套件是一樣的。)
- 根據 virtualenv 執行相關 python 指令 (不進入虛擬環境中)
$ pipenv run python test.py
- 進入虛擬環境中,類似於 “source venv/bin/activate”
$ pipenv shell
Loading .env environment variables…
Launching subshell in virtual environment. Type 'exit' or 'Ctrl+D' to return.
- 移除套件
$ pipenv uninstall request
其他進階指令
pipenv check
根據 PEP 508 執行套件安全性檢查pipenv graph
印出套件的相依圖pipenv lock --requirements > requirements.txt
產生requirements.txt
給特定平台如:AWS Elastic Beanstalk
參考: