pipenv 是什麼
pipenv 是 python 官方推薦的包管理工具,整合了 virtualenv、pyenv 和 pip 三者的功能於一身,類似於 php 中的 composer。
我們知道,為了方便管理 python 的虛擬環境和庫,通常使用較多的是 virtualenv 、pyenv 和 pip,但是他們不夠好用或者說不夠偷懶。於是 requests 的作者 Kenneth Reitz 開發了用於建立和管理 python 虛擬環境的工具 —- pipenv。
它能夠自動為專案建立和管理虛擬環境,從 Pipfile 檔案中新增或者刪除包,同時生成 Pipfile.lock 檔案來鎖定安裝包的版本和依賴資訊,避免構建錯誤。
pipenv 主要解決了以下問題:
- 不用再單獨使用 virtualenv、pyenv 和 pip 了,現在它們結合到了一起。
- 不用再維護 requirement.txt 了,使用 Pipfile 和 Pipfile.lock 來代替。
- 可以在開發環境使用多個 python 版本。
- 在安裝的 pyenv 條件下,可以自動安裝需要的 python 版本。
- 安全,廣泛地使用 Hash 校驗,能夠自動曝露安全漏洞。
- 隨時檢視圖形化的依賴關係。
安裝 pipenv
由於我的開發環境一直都是 Mac 筆記本,所以這裡只介紹在 Mac 環境如何安裝好了。
使用 pip 安裝
$ pip install --user pipenv
複製程式碼
這個命令在使用者級別(非系統全域性)下安裝 pipenv。如果安裝後 shell 提示找不到 pipenv 命令,你需要新增當前 Python 使用者主目錄的 bin 目錄到 PATH 環境變數。如果你不知道 Python 使用者主目錄在哪裡,用下面的命令來檢視:
$ python -m site --user-base
複製程式碼
你會看到類似下面的輸出
/Users/liyafeng/Library/Python/3.6
複製程式碼
使用 brew 安裝
Mac 下使用 brew 安裝軟體應該是最方便的了,推薦使用:
brew install pipenv
複製程式碼
升級 pipenv:
brew upgrade pipenv
複製程式碼
shell 自動補齊
Linux or Mac 環境下,bash下如果能自動命令補全豈不是更好?請把如下語句追加到.bashrc
或者.zshrc
即可:
eval "$(pipenv --completion)"
複製程式碼
常用命令
pipenv 具有的選項:
$ pipenv
Usage: pipenv [OPTIONS] COMMAND [ARGS]...
Options:
--where 顯示專案檔案所在路徑
--venv 顯示虛擬環境實際檔案所在路徑
--py 顯示虛擬環境Python直譯器所在路徑
--envs 顯示虛擬環境的選項變數
--rm 刪除虛擬環境
--bare 最小化輸出
--completion 完整輸出
--man 顯示幫助頁面
--three / --two 使用Python 3/2建立虛擬環境(注意本機已安裝的Python版本)
--python TEXT 指定某個Python版本作為虛擬環境的安裝源
--site-packages 附帶安裝原Python直譯器中的第三方庫
--jumbotron An easter egg, effectively.
--version 版本資訊
-h, --help 幫助資訊
複製程式碼
pipenv 可使用的命令引數:
Commands:
check 檢查安全漏洞
graph 顯示當前依賴關係圖資訊
install 安裝虛擬環境或者第三方庫
lock 鎖定並生成Pipfile.lock檔案
open 在編輯器中檢視一個庫
run 在虛擬環境中執行命令
shell 進入虛擬環境
uninstall 解除安裝一個庫
update 解除安裝當前所有的包,並安裝它們的最新版本
複製程式碼
一些例子:
Usage Examples:
Create a new project using Python 3.6, specifically:
$ pipenv --python 3.6
Install all dependencies for a project (including dev):
$ pipenv install --dev
Create a lockfile containing pre-releases:
$ pipenv lock --pre
Show a graph of your installed dependencies:
$ pipenv graph
Check your installed dependencies for security vulnerabilities:
$ pipenv check
Install a local setup.py into your virtual environment/Pipfile:
$ pipenv install -e .
Use a lower-level pip command:
$ pipenv run pip freeze
複製程式碼
pipenv 使用過程
建立環境,安裝指定 python 的版本資訊:
mkdir new_env & cd new_env
pipenv install // pipenv install --three
複製程式碼
如果指定了 --two
或者 --three
選項引數,則會使用 python2 或者 python3 的版本安裝,否則將使用預設的 python 版本來安裝。當然也可以指定準確的版本資訊:
$ pipenv install --python 3
$ pipenv install --python 3.6
$ pipenv install --python 2.7.14
複製程式碼
pipenv 會自動掃描系統尋找合適的版本資訊,如果找不到的話,同時又安裝了 pyenv 的話,則會自動呼叫 pyenv 下載對應版本的 python, 否則會報錯。
這時候在當前 new_env
環境下生成 Pipfile
和 Pipfile.lock
兩個環境初始化檔案。
進入|退出環境:
進入環境:
pipenv shell
複製程式碼
退出環境:
exit //或者 ctrl+d
複製程式碼
安裝第三方包:
這裡我們測試安裝 urllib3
包好了:
pipenv install urllib3
複製程式碼
此時,Pipfile 裡有最新安裝的包檔案的資訊,如名稱、版本等。用來在重新安裝專案依賴或與他人共享專案時,你可以用 Pipfile 來跟蹤專案依賴。
Pipfile 是用來替代原來的 requirements.txt 的,內容類似下面這樣。source 部分用來設定倉庫地址,packages 部分用來指定專案依賴的包,dev-packages 部分用來指定開發環境需要的包,這樣分開便於管理。
$ cat Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
"urllib3" = "*"
[dev-packages]
[requires]
python_version = "3.6"
複製程式碼
Pipfile.lock 則包含你的系統資訊,所有已安裝包的依賴包及其版本資訊,以及所有安裝包及其依賴包的 Hash 校驗資訊。
$ Pipfile.lock
{
"_meta": {
"hash": {
"sha256": "af58f3510cb613d4d9241128f9a0ceb9bb936ad907543e23ad8317011dcb6715"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.6"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"urllib3": {
"hashes": [
"sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf",
"sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5"
],
"index": "pypi",
"version": "==1.23"
}
},
"develop": {}
}
複製程式碼
現在安裝另一個包,再次檢視這兩個檔案的內容。你會發現 Pipfile 現在包含兩個安裝包了,Pipfile.lock 也包含了所有已安裝包的依賴包及其版本資訊,以及所有安裝包及其依賴包的 Hash 校驗資訊。每次你安裝新的依賴包,這兩個檔案都會自動更新。
安裝指定版本包:
pipenv install urllib3==1.22
複製程式碼
安裝開發環境下的包:
加 --dev
表示包括 Pipfile 的 dev-packages 中的依賴。
pipenv install httpie --dev
複製程式碼
解除安裝第三方包:
pipenv uninstall urllib3 //或者 pipenv uninstall --all
複製程式碼
更新安裝包:
pipenv update urllib3
複製程式碼
更新所有包:
pipenv update
複製程式碼
這個命令會刪除所有軟體包然後重新安裝最新的版本。
檢視虛擬環境目錄:
$ pipenv --venv
/Users/liyafeng/.local/share/virtualenvs/new_env-UVLdq9CB
複製程式碼
最後的虛擬環境目錄是以當前環境 new_env
作為目錄開頭的。
檢視專案根目錄:
$ pipenv --where
/Users/liyafeng/Documents/www/pythondemo/new_env
複製程式碼
檢查軟體包的完整性
你是否擔心已安裝的軟體包有沒有安全漏洞?沒關係,pipenv 可以幫你檢查,執行下面的命令:
$ pipenv check
Checking PEP 508 requirements…
Passed!
Checking installed package safety…
All good!
複製程式碼
上面的命令根據 Pipfile 裡的 PEP 508 標記檢查安全漏洞。
檢視依賴樹
$ pipenv graph
httpie==0.9.9
- Pygments [required: >=2.1.3, installed: 2.2.0]
- requests [required: >=2.11.0, installed: 2.19.1]
- certifi [required: >=2017.4.17, installed: 2018.4.16]
- chardet [required: <3.1.0,>=3.0.2, installed: 3.0.4]
- idna [required: <2.8,>=2.5, installed: 2.7]
- urllib3 [required: >=1.21.1,<1.24, installed: 1.23]
複製程式碼
鎖定版本
更新 lock 檔案鎖定當前環境的依賴版本
pipenv lock
複製程式碼
環境變數管理
如果你開發除錯時需要配一堆環境變數,可以寫到 .env 檔案中,在 pipenv shell
進入虛擬環境時,它會幫你把這些環境變數載入好,非常方便。
例如寫一個 .env 檔案:
echo "FOO=hello foo" > .env
複製程式碼
之後 pipenv shell
進入虛擬環境,echo $FOO
就能看環境變數的值 hello foo
已經設定好了。