Pipenv 更簡單、更快速的 Python 套件管理工具

Chi-Hsuan Huang
6 min readFeb 27, 2018

--

以往當我們有兩個專案,一個專案使用 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,不需要再分別使用 pipvirtualenv
  • 自動產生與更新Pipfile and Pipfile.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

參考:

https://github.com/pypa/pipenv

--

--

Chi-Hsuan Huang

Back to The Mind: Follow Your Heart. Co-Founder at Taiwanstat; Full Stack Developer. https://github.com/chihsuan