Pipenv虛擬環境

RockChe發表於2021-06-18

什麼是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下載源

檢視依賴樹

$ pipenv graph

鎖定版本

更新 lock 檔案鎖定當前環境的依賴版本

$ pipenv lock

參考連結

Pipenv – 超好用的 Python 包管理工具
PyCharm+Pipenv虛擬環境開發和依賴管理的教程詳解

相關文章