之前介紹過《利用pyenv管理多個版本的python》,pyenv 是一個非常好用的 Python 版本管理工具,利用它我們可以在同一臺電腦上安裝多個版本的 Python ,這個過程非常簡單。Mac系統的電腦一行命令就可以安裝了:
brew install pyenv
複製程式碼
pyenv 的安裝和使用詳見開篇提到的文章,這裡不再贅述。
今天主要是想介紹另一個非常好用的 Python 工具——"Pipenv"
Pipenv是什麼?
Pipenv is a tool that aims to bring the best of all packaging worlds (bundler, composer, npm, cargo, yarn, etc.) to the Python world. Windows is a first-class citizen, in our world.
It automatically creates and manages a virtualenv for your projects, as well as adds/removes packages from your
Pipfile
as you install/uninstall packages. It also generates the ever-importantPipfile.lock
, which is used to produce deterministic builds.
上段引用自官方文件,簡單來說就是 Pipenv 是希望成為 Python 界最好的包管理工具,成為 Python 界的 npm。你可以使用 Pipenv 這一個工具來安裝、解除安裝、跟蹤和記錄依賴性,並建立、使用和組織你的虛擬環境。
當你使用它啟動一個專案時,如果你還沒有使用虛擬環境的話,Pipenv 將自動為該專案建立一個虛擬環境。
Pipenv 使用 Pipfile
和 Pipfile.lock
來管理依賴包,並且在使用 pipenv 新增或刪除包時,自動維護 Pipfile 檔案,同時生成 Pipfile.lock 來鎖定安裝包的版本和依賴資訊,避免構建錯誤。相比pip需要手動維護requirements.txt 中的安裝包和版本,具有很大的進步。
為什麼要使用 Pipenv
設想一個場景:你手頭有多個開發專案,其中專案 A 和專案 B 要求用 Python3,專案C需要用 Python2,而專案 A 和專案 B 又要求第三方依賴包相互獨立,互不干擾。
這個時候,為了滿足版本的不同我們需要使用 Pyenv 安裝多個版本的 Python ,同時為了使不同專案之間隔離開來,我們可以使用 Pipenv 建立虛擬的開發環境。
那有的人就要問了,virtualenv
不就可以建立虛擬環境了嗎,為什麼還要使用 Pipenv ,這裡先賣個關子,文末我再來比較這些常見工具之間的差異性。
使用 Pipenv
安裝 Pipenv
如果你是Mac電腦,那麼推薦使用Homebrew來安裝。
brew install pipenv
複製程式碼
如果不是Mac電腦,建議 使用Python3的pip3 安裝:
pip3 install pipenv
複製程式碼
執行pipenv,可以檢視pipenv的幫助資訊:
pipenv
複製程式碼
如果出現如下資訊,就說明安裝成功了:
為專案建立虛擬環境
預設地,虛擬環境會建立在~/.local/share/virtualenvs
目錄裡面。
如果我們希望在每個專案的根目錄下儲存虛擬環境目錄(.venv),需要在 .bashrc
或 .bash_profile
中配置如下:
export PIPENV_VENV_IN_PROJECT=1
複製程式碼
要想使配置生效,執行下source ~/.bashrc
或者source ~/.bash_profile
即可使環境變數生效。
接下來我們為專案建立虛擬環境。
mkdir pipenv_demo
cd pipenv_demo
pipenv --python 3.6.7 # 為當前初始化一個版本為 3.6.7 的python環境
複製程式碼
首次執行
如果是第一次在專案中執行 pipenv
命令的話,會在專案中建立一個名為 Pipfile
的檔案,檔案內容類似下面這樣。
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"
[packages]
requests-html = "*"
[dev-packages]
[requires]
python_version = "3.7"
複製程式碼
這個檔案就類似於 maven 中的 pom.xml
、npm 中的 package.json
檔案。如果執行過install、update等命令的話,還會建立一個Pipfile.lock
檔案,類似npm中的lock檔案。這兩個檔案就是pipenv用於管理第三方庫的配置檔案,如果同時使用版本控制軟體的話,需要將它們也加入進去。
Tips:對於這個檔案我們需要先做一件事,就是更改 [[source]] 中的 url 為國內映象。
[[source]] url = "https://pypi.tuna.tsinghua.edu.cn/simple" 複製程式碼
常用命令
安裝專案依賴
如果我想在專案中安裝requests這個包,執行:
pipenv install requests
複製程式碼
如果需要指定具體版本號,可以這樣:
pipenv install requests==2.13.0
複製程式碼
如果是第一次執行pipenv的話,會先建立Pipfile檔案,否則會修改Pipfile檔案。
該命令還有一個常用引數-d或--dev,用於安裝僅供開發使用的包。
Tips:用 git 管理專案時候,要把
Pipfile
和Pipfile.lock
加入版本跟蹤。這樣 clone 了這個專案的同學,只需要執行pipenv install 複製程式碼
就可以安裝所有的Pipfile中 [packages]部分的包了,並且自動為專案在自己電腦上建立了虛擬環境。
解除安裝某個依賴
相應的還有命令來解除安裝第三方包,該命令還有兩個引數--all
和--all-dev
用於解除安裝所有包和所有開發包。
pipenv uninstall requests
複製程式碼
更新專案依賴
檢視所有需要更新的包:
pipenv update --outdated
複製程式碼
更新所有包:
pipenv update
複製程式碼
更新指定的包:
pipenv update <包名>
複製程式碼
其他命令
pipenv -h # 檢視幫助
pipenv graph # 檢視已安裝的包
pipenv shell # 啟動shell
pipenv run python hello.py # 執行指令碼
複製程式碼
Python 管理哪家強?
還記得在最開始提出的問題嗎?明明virtualenv
就可以建立虛擬環境了嗎,為什麼還要使用 Pipenv 呢?
接下來我們來橫向對比下幾個常見的容易弄混的 python 管理工具(我在初學的時候總是分不清?)
工具 | 介紹 | 原理 |
---|---|---|
pip | 包管理工具 | |
virtualenv | 虛擬環境管理工具 | 切換目錄 |
virtualenvwrapper | 虛擬環境管理工具加強版 | |
pyenv | python版本管理工具 | 修改環境變數 |
pyenv-virtualenv | 虛擬環境管理工具 | |
pipenv | 專案環境管理工具 | |
anaconda | 一個包含180+的科學包及其依賴項的發行版本(不只是 Python 可用) |
同時在推薦一個我在 stackoverflow 上看到的回答:What is the difference between pyenv, virtualenv, anaconda?
實踐建議:
建議團隊內開發人員,在自己電腦上都安裝 pyenv 和 pipenv 。Pipfile 和 Pipfile.lock 加入版本跟蹤,.venv 不要加入版本管理。為自己的每一個專案建立獨立的虛擬環境。