pipenv 使用簡介

PrivateRookie發表於2019-04-20

之前在開發時一直使用 conda 使用作為虛擬環境管理工具,但有時候會經常會臨時性的需要一個虛擬環境,
如果使用 conda create 建立一個新環境,耗時不說,有時候還忘了刪除,最後系統裡一堆的虛擬環境。
偶然發現 pipenv 後試用了一下,感覺它的工作流相比之前虛擬環境環境加 requirements.txt
的方式更加簡單方便。

安裝

pipenv 最好和 Python3 一起使用

最簡單的方式是通過 pip 安裝

pip3 install pipenv

如果是 mac 使用者也可以通過 Homebrew 安裝

brew install pipenv

如果沒有安裝 pip 可以通過以下方式安裝

https://raw.githubusercontent.com/kennethreitz/pipenv/master/get-pipenv.py | python

使用

建立新專案

mkdir myproject
pipenv install

這會在 myproject 檔案下建立 PipfilePipfile.lock 檔案,同時建立虛擬環境
虛擬環境名稱為 pipenv 加專案路徑雜湊值,如 pipenv-7BgKv-oX

ll
-rw-r--r-- 1 rookie rookie 138 4月  20 20:24 Pipfile
-rw-r--r-- 1 rookie rookie 453 4月  20 20:24 Pipfile.lock

虛擬機器環境預設位於 ~/.local/share/virtualenvs/,由於 pipenv 通過路徑名雜湊值與虛擬環境
建立對映關係,因此如果移動專案會導致虛擬環境不可用。可以通過在 .bashrc 新增
export PIPENV_VENV_IN_PROJECT=1 讓 pipenv 在專案檔案中建立虛擬環境,這時候虛擬環境位於 myproject/.venv 資料夾下。

如果項刪除虛擬環境,在專案頂層目錄下執行

pipenv --rm

如果要指定 Python 版本,可以通過 --python 完成,如我要安裝 python3.7 的虛擬環境

pipenv --python 3.7

配置檔案

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

[dev-packages]

[packages]

[requires]
python_version = "3.6"

[[source]] 模組指定了 pip 源位置,通常國內 pip 源加快下載速度

[[source]]
name = "tuna"
url = "https://pypi.tuna.tsinghua.edu.cn/simple/"
verify_ssl = true

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

[dev-packages]

[packages]

[requires]
python_version = "3.6"

安裝和解除安裝 packages

你可以編輯 packages, 新增專案需要的 Python 庫,如 requests='**',甚至可以指定不同
平臺下的包配置,詳細配置參考 Advanced Usage of Pipenv
不過你可以通過pipenv install requests
來安裝,pipenv 將會自動更新 PipfilePipfile.lock
[dev-packages] 則是一些開發依賴但不是專案依賴包的存放目錄,如 pylint 等 pep8 檢查工具
可以在安裝時指定 pipenv install --dev將某個包宣告為 dev-package
解除安裝 package 也很簡單

pip uninstall

如果通過 pipenv 命令安裝和解除安裝 package,安裝或解除安裝完成後還會更新 Pipfile.lock 檔案,有時候會卡在這個步驟。通常可以 ctrl+c 強制推出,刪除 Pipfile.lock, 然後

pipenv lock

重新生成該檔案

進入和退出虛擬環境

進入虛擬環境

 cd myproject

 pipenv shell

退出虛擬環境

pipenv exit

高階用法

有時候某些 package 需要指定特定的 pip 源,可以通過如下方式指定,非常簡便

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

[[source]]
url = "http://pypi.home.kennethreitz.org/simple"
verify_ssl = false
name = "home"

[dev-packages]

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

有時候需要生成 requirements.txt 檔案

pipenv lock -r

如果只需要生成 dev-pakcages 列表,也很簡單

pipenv lock -r --dev

自動載入環境變數檔案。如果 .env 檔案在專案根目錄下,pipenv shellpipenv run
會自動載入檔案中的環境變數。

$ 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'

pipenv 還支援自定義命令,這對於某些開發過程中經常使用的命令來說非常方便。
Pipfile 中新增 [scripts]

[scripts]
printspam = "python -c \"print('I am a silly example, no one would need to do this')\""

通過 pipenv run <custom_command> 即可執行自定義命令,如

pipenv run echospam "indeed"
I am really a very silly example indeed

更多高階使用者可以參考 官方文件


歡迎關注我的 blog

本作品採用《CC 協議》,轉載必須註明作者和本文連結

多少事,從來急。天地轉,光陰迫。