什麼是Pipenv
Pipenv是python官方推薦的虛擬環境管理工具,可以把它當作是virtualenv,pip,pyenv三者的集合工具,類似於npm和composer。
它能夠自動為專案建立和管理虛擬環境,從 Pipfile 檔案中新增或者刪除包,同時生成 Pipfile.lock 檔案來鎖定安裝包的版本和依賴資訊,避免構建錯誤。
pipenv 主要解決了以下問題:
- 不用再單獨使用 virtualenv、pyenv 和 pip 了,現在它們結合到了一起。
- 不用再維護 requirement.txt 了,使用 Pipfile 和 Pipfile.lock 來代替。
- 可以在開發環境使用多個 python 版本。
- 在安裝的 pyenv 條件下,可以自動安裝需要的 python 版本。
- 安全,廣泛地使用 Hash 校驗,能夠自動曝露安全漏洞。
- 隨時檢視圖形化的依賴關係。
- 可通過自動載入 .env 讀取環境變數,簡化開發流程。
安裝 pipenv
MacOS下使用pip安裝
$ pip install --user pipenv
這個命令在使用者級別(非系統全域性)下安裝 pipenv。如果安裝後 shell 提示找不到 pipenv 命令,你需要新增當前 Python 使用者主目錄的 bin 目錄到 PATH 環境變數。如果你不知道 Python 使用者主目錄在哪裡,用下面的命令來檢視:
$ python -m site --user-base
輸出如下
MacOS下使用brew安裝
$ brew install pipenv
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 幫助資訊
命令引數
Commands:
check 檢查安全漏洞
graph 顯示當前依賴關係圖資訊
install 安裝虛擬環境或者第三方庫
lock 鎖定並生成Pipfile.lock檔案
open 在編輯器中檢視一個庫
run 在虛擬環境中執行命令
shell 進入虛擬環境
uninstall 解除安裝一個庫
update 解除安裝當前所有的包,並安裝它們的最新版本
pipenv 使用
建立環境,安裝指定版本的python
首先需要看一下當前目錄是否已經建立了虛擬環境,使用如下命令
$ pipenv -venv
結果如下
這說明當前的專案沒有建立虛擬環境,可以使用Pipenv 來建立一個虛擬環境:
$ pipenv –three
如果指定了 --two 或者 --three 選項引數,則會使用 python2 或者 python3 的版本安裝,否則將使用預設的 python 版本來安裝。當然也可以指定準確的版本資訊:
$ pipenv install --python 3
$ pipenv install --python 3.8
$ pipenv install --python 2.7.14
pipenv 會自動掃描系統尋找合適的版本資訊,如果找不到的話,同時又安裝了 pyenv 的話,則會自動呼叫 pyenv 下載對應版本的 python, 否則會報錯。
這時候在當前專案根目錄下會生成 Pipfile 和 Pipfile.lock 兩個環境初始化檔案
進入|退出環境
進入環境
pipenv shell
退出環境
exit
安裝第三方包
測試安裝 selenium 包
pipenv install selenium
此時,Pipfile 裡有最新安裝的包檔案的資訊,如名稱、版本等。用來在重新安裝專案依賴或與他人共享專案時,你可以用 Pipfile 來跟蹤專案依賴。
Pipfile 是用來替代原來的 requirements.txt 的,內容類似下面這樣。source 部分用來設定倉庫地址,packages 部分用來指定專案依賴的包,dev-packages 部分用來指定開發環境需要的包,這樣分開便於管理。
$ cat Pipfile[[source]]name = "pypi"url = "https://pypi.tuna.tsinghua.edu.cn/simple/"verify_ssl = true[packages]urllib3 = "*"selenium = "*"[dev-packages][requires]python_version = "3.8"
Pipfile.lock 則包含你的系統資訊,所有已安裝包的依賴包及其版本資訊,以及所有安裝包及其依賴包的 Hash 校驗資訊。
$ Pipfile.lock{ "_meta": { "hash": { "sha256": "b02856f549692af24a14f79bfe022df973a9ea09ddfb4cbf7c7ecab5248ac322" }, "pipfile-spec": 6, "requires": { "python_version": "3.8" }, "sources": [ { "name": "pypi", "url": "https://pypi.tuna.tsinghua.edu.cn/simple/", "verify_ssl": true } ] }, "default": { "selenium": { "hashes": [ "sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c", "sha256:deaf32b60ad91a4611b98d8002757f29e6f2c2d5fcaf202e1c9ad06d6772300d" ], "index": "pypi", "version": "==3.141.0" }, "urllib3": { "hashes": [ "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df", "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937" ], "index": "pypi", "version": "==1.26.4" } }, "develop": {}}
那麼Pipfile 和 Pipfile.lock 有什麼用呢?
Pipfile 其實一個 TOML 格式的檔案,標識了該專案依賴包的基本資訊,還區分了生產環境和開發環境的包標識,作用上類似 requirements.txt 檔案,但是功能更為強大。
Pipfile.lock 詳細標識了該專案的安裝的包的精確版本資訊、最新可用版本資訊和當前庫檔案的 hash 值,顧明思義,它起了版本鎖的作用。
可以注意到當前 Pipfile.lock 檔案中的 Selenium 版本標識為 ==3.141.0,意思是當前我們開發時使用的就是 3.141.0版本,它可以起到版本鎖定的功能。
舉個例子,剛才我們安裝了 Selenium 3.141.0 的版本,即目前(2021.5.22)的最新版本。但可能 Selenium 以後還會有更新,比如某一天 Selenium 更新到了 3.2 版本,這時如果我們想要重新部署本專案到另一臺機器上,假如此時不存在 Pipfile.lock 檔案,只存在 Pipfile檔案,由於 Pipfile 檔案中標識的 Selenium 依賴為 selenium= “*”,即沒有版本限制,它會預設安裝最新版本的 Selenium,即 3.2,但由於 Pipfile.lock 檔案的存在,它會根據 Pipfile.lock 來安裝,還是會安裝 Selenium 3.141.0,這樣就會避免一些庫版本更新導致不相容的問題。
安裝指定版本包
pipenv install selenium==3.141.0
安裝開發環境下的包
通常有一些Python包只在你的開發環境中需要,而不是在生產環境中,例如單元測試包。 加 --dev 表示包括 Pipfile 的 dev-packages 中的依賴。
pipenv install unittest --dev
django庫現在將只在開發虛擬環境中使用。如果你要在你的生產環境中安裝你的專案:
pipenv install
這不會安裝unittest包。
但是,如果有一個開發人員將你的專案克隆到自己的開發環境中,他們可以使用–dev標誌,將django也安裝:
pipenv install –dev
也就是說一個–dev引數,幫你在同一個虛擬環境中又區分出了開發和非開發環境
解除安裝第三方包
pipenv uninstall selenium //或者 pipenv uninstall --all
更新安裝包
pipenv update selenium pipenv update # 更新所有安裝包
檢視虛擬環境目錄
$ pipenv --venv
檢視專案根目錄
$ pipenv --where
檢查軟體包的完整性
$ pipenv check
生成Pipfile.lock
有時候可能 Pipfile.lock 檔案不存在或被刪除了,可以使用如下命令生成:
$ pipenv lock
修改Pipenv下載源
在使用pipenv install安裝的過程中如果下載比較慢可以在pipfile檔案中指定下載源:
[[source]]name = "pypi"url = "https://pypi.tuna.tsinghua.edu.cn/simple/"verify_ssl = true[packages]urllib3 = "*"selenium = "*"[dev-packages][requires]python_version = "3.8"
Pip下載源
- 阿里: http://mirrors.aliyun.com/pypi/simple/
- 豆瓣: http://pypi.douban.com/simple/
- 清華: https://pypi.tuna.tsinghua.edu.cn/simple
檢視依賴樹
$ pipenv graph
鎖定版本
更新 lock 檔案鎖定當前環境的依賴版本
$ pipenv lock