pipenv快速入門

過了即是客發表於2018-09-28

學過Python的同學應該都瞭解pip這個工具,我們用pip絕大部分的第三方庫都可以用pip來安裝,用起來很方便。但是如果我們要把專案部署到伺服器上面的話,就稍微有些麻煩了,因為還需要在伺服器上用pip安裝這些包,假如專案中用到很多包的話,一個個安裝會很麻煩,而且沒有通用性。Java上的maven、gradle,NodeJS的npm這些工具就不存在這個問題,它們有一個或多個的專門的依賴檔案來管理這些包。pipenv就是這樣一個類似的工具,可以幫助我們管理Python和第三方庫的版本。

安裝

安裝pipenv很簡單,用pip命令就可以安裝。

pip install pipenv

將來需要更新pipenv的時候,執行:

pip install --user --upgrade pipenv

首次執行

如果是第一次在專案中執行pipenv命令的話,會在專案中建立一個名為Pipfile的檔案,檔案內容類似下面這樣。用過maven、gradle等工具的同學對此應該熟悉,相信不用我解釋其中的含義。

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
requests-html = "*"

[dev-packages]

[requires]
python_version = "3.7"

如果執行過install、update等命令的話,還會建立一個Pipfile.lock檔案,類似npm中的lock檔案。這兩個檔案就是pipenv用於管理第三方庫的配置檔案,如果同時使用版本控制軟體的話,需要將它們也加入進去。

常用命令

安裝

例如,我想在專案中安裝requests這個包,執行:

pipenv install requests

如果需要指定具體版本號,可以這樣:

pipenv install requests==2.13.0

如果是第一次執行pipenv的話,會先建立Pipfile檔案,否則會修改Pipfile`檔案。

該命令還有一個常用引數-d--dev,用於安裝僅供開發使用的包。

解除安裝

相應的還有命令來解除安裝第三方包,該命令還有兩個引數--all--all-dev用於解除安裝所有包和所有開發包。

pipenv uninstall requests

更新

檢視所有需要更新的包:

pipenv update --outdated

更新所有包:

pipenv update

更新指定的包:

pipenv update <包名>

從requirements.txt匯入

如果專案中有requirements.txt檔案,pipenv會在安裝的時候自動匯入。如果需要匯入其他位置的requirements.txt,可以用下面的命令:

pipenv install -r path/to/requirements.txt

指定Python版本

pipenv會建立虛擬Python環境,並在其中用pip安裝所有包。如果要指定Python版本,可以用下面的命令,三種版本號都支援:

pipenv --python 3
pipenv --python 3.6
pipenv --python 2.7.14

如果不指定版本號,pipenv會使用系統預設的Python版本。需要注意,這裡指定的Python必須是系統已經安裝的、可以在環境變數中搜尋到的版本號,如果指定未安裝的版本,會提示錯誤。

執行命令

用下面的命令可以啟動一個在虛擬環境中的shell:

pipenv shell

如果不想啟動shell,而是直接在虛擬環境中執行命令,可以使用run:

pipenv run python --version

高階用法

一開始我文件沒看全,然後用pipenv的時候發現有一些問題,後來我發現官方文件還有一部分高階內容也很重要,所以再來補充一下。當然如果有需要的話還是得看原文

匯出requirements.txt

用下面的命令就可以將PipfilePipfile.lock檔案裡面的包匯出為requirements.txt檔案。

pipenv lock -r

如果只想匯出開發用的包,可以新增--dev引數:

pipenv lock -r --dev

自動安裝Python

pipenv只能搜尋系統中已經安裝的Python版本,對於未安裝的版本,會提示錯誤。但是如果你同時安裝了pyenv的話,pipenv會自動發現pyenv,然後直接詢問你是否要安裝。這樣一來,原來的工作流程是:用pyenv安裝某個Python->用virtualenv或venv建立虛擬環境->用pip從requirements.txt中安裝包->將來可能還要更新包。現在完全可以用pipenv一兩條命令解決,真的是非常方便。

自動載入.env檔案

.env檔案可以設定一些環境變數,在程式開發的時候模擬環境變數。pipenv也可以自動載入.env檔案。

$ cat .env
HELLO=WORLD⏎

$ pipenv run python
Loading .env environment variables…
Python 2.7.13 (default, Jul 18 2017, 09:17:00)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ[`HELLO`]
`WORLD`

環境變數支援

Pipfile中也可以引用環境變數的值,格式為${MY_ENVAR}$MY_ENVAR,在Windows系統中還支援%MY_ENVAR%

[[source]]
url = "https://${PYPI_USERNAME}:${PYPI_PASSWORD}@my_private_repo.example.com/simple"
verify_ssl = true
name = "pypi"

[dev-packages]

[packages]
requests = {version="*", index="home"}
maya = {version="*", index="pypi"}
records = "*"

自定義虛擬環境路徑

很多工具遵循Linux開發習慣,將東西全存在使用者目錄中,在Linux中可能沒啥,但是在Windows下可能有人不喜歡把這些東西放在使用者目錄。當然pipenv也可以自定義,只需要設定或修改WORKON_HOME環境變數的值即可。

如果設定了PIPENV_VENV_IN_PROJECT環境變數,pipenv會把虛擬環境放在專案目錄的.venv目錄下。

配置pipenv

pipenv還有一些配置,都是使用環境變數配置的,由於配置項比較多,這裡就不介紹了,直接看官方文件好了。

setup.py安裝

pipenv也可以從setup.py安裝:

pipenv install -e .

那麼為什麼不全用pipenv來安裝呢?官方文件這裡為我們做出瞭解釋:專案可以分為兩種,程式和庫,對於程式來說應該使用pipenv,而對於庫來說則是在setup.py中安裝。詳細解釋說實話我沒太看懂,大意就是抽象依賴和具體依賴,還有一個責任分配的問題,原文在這裡