Pipenv 是 Pipfile 主要倡導(dǎo)者、requests 作者 Kenneth Reitz 寫的一個(gè)命令行工具,,主要包含了Pipfile,、pip、click,、requests和virtualenv,,能夠有效管理Python多個(gè)環(huán)境,各種第三方包及模塊,。它會(huì)自動(dòng)為您的項(xiàng)目創(chuàng)建和管理一個(gè)virtualenv,,并在安裝/卸載包時(shí)從Pipfile中添加/刪除包。它還生成非常重要的Pipfile.lock文件,,用于生成確定性構(gòu)建,。
Pipenv 特性:
- pipenv集成了pip,virtualenv兩者的功能,,且完善了兩者的一些缺陷,。
- 管理requirements.txt文件可能會(huì)有問題,而Pipenv使用Pipfile和Pipfile.lock 這使得對(duì)于基本用例來說更為優(yōu)越,。
- 各個(gè)地方使用了哈希校驗(yàn),,不僅安全,且會(huì)自動(dòng)公開安全漏洞,。
- 讓您深入了解自己的關(guān)系依賴圖(例如$ pipenv graph),。
- 通過加載.env文件簡化開發(fā)工作流程。
Pipenv 所解決的問題:
- requirements.txt 依賴管理的局限
使用 requirements.txt 管理依賴的時(shí)候可能會(huì)出現(xiàn) 不確定構(gòu)建 (the build isn’t deterministic) 問題,舉個(gè)栗子: 如果程序中要使用 TensorFlow 庫,,那么我們應(yīng)該在requirements.txt里面寫上
# requirements.txt:
TensorFlow
...
由于沒有指定版本,,因此通過指令 pip install -r requirements.txt 安裝依賴模塊時(shí),會(huì)默認(rèn)安裝最新版本的TensorFlow ,,如果新版本向后兼容,,這完全不用care,但是如果不能向后兼容就會(huì)出現(xiàn):代碼無法在該環(huán)境運(yùn)行,,即測試環(huán)境和生產(chǎn)環(huán)境的同一份requirement.txt,,結(jié)果出來2份不同的環(huán)境。再考慮模塊本身的依賴等問題,,會(huì)發(fā)現(xiàn)越來越令人頭大,。而Pipenv使用的Pipfile和Pipfile.lock文件則可以比較好的解決這些問題。
- 多個(gè)項(xiàng)目依賴不同第三方庫,、包版本問題
如應(yīng)用程序A需要特定模塊的1.0版本但應(yīng)用程序B需要2.0版本,,當(dāng)我在A和B程序間切換時(shí),需要不斷檢測–卸載–安裝模塊,。這意味著只安裝其中一個(gè)版本可能無法滿足每個(gè)應(yīng)用程序的要求,,因此需要?jiǎng)?chuàng)建虛擬環(huán)境來將A、B程序所需的第三方包分隔開來,,此時(shí)常用的 virtualenv,、venv均可以滿足要求,Pipenv也同樣集成了該功能,。
Pipenv 簡單使用:
- Pipenv 安裝
# pip 安裝
pip3 install pipenv # 全局安裝,,如果只想在當(dāng)前用戶模式下安裝,可添加參數(shù):--user
# 如需更新可使用
pip3 install --user --upgrade pipenv
注: 如果在使用當(dāng)前用戶模式下安裝pipenv后在shell中提示不可用,,則需要把用戶庫的目錄“C:\Users\XXX\AppData\Roaming\Python\Python37\Scripts”添加到你的PATH【系統(tǒng)環(huán)境路徑】中,,然后重啟電腦,環(huán)境變量生效后即可使用,。
- Pipenv 常用命令
pipenv --two # 使用當(dāng)前系統(tǒng)中的Python2 創(chuàng)建環(huán)境
pipenv --three # 使用當(dāng)前系統(tǒng)中的Python3 創(chuàng)建環(huán)境
pipenv --python 3 # 指定使用Python3創(chuàng)建環(huán)境
pipenv --python 3.6 # 指定使用Python3.6創(chuàng)建環(huán)境
pipenv --python 2.7.14 # 指定使用Python2.7.14創(chuàng)建環(huán)境
注: 1)創(chuàng)建環(huán)境時(shí)應(yīng)使用系統(tǒng)中已經(jīng)安裝的,、能夠在環(huán)境變量中搜索到的Python 版本,否則會(huì)報(bào)錯(cuò),。 2)每次創(chuàng)建環(huán)境都會(huì)在當(dāng)前目錄下生成一個(gè)名為Pipfile文件,,用來記錄剛創(chuàng)建的環(huán)境信息,如果當(dāng)前目錄下之前存在該文件,,會(huì)將其覆蓋。 3)在使用指定版本創(chuàng)建環(huán)境的時(shí)候,,版本號(hào)與參數(shù) --python 之間有個(gè)空格,。 使用Python3.6創(chuàng)建環(huán)境并查看生成的Pipfile文件內(nèi)容:
pipenv shell # 激活虛擬環(huán)境
環(huán)境經(jīng)激活后,會(huì)發(fā)現(xiàn)命令提示符變了:(下圖中的“pipenv-6sd8rYgi”前綴,表示生成了名為“pipenv-6sd8rYgi”的虛擬環(huán)境)
pipenv --where # 顯示目錄信息
pipenv --venv # 顯示虛擬環(huán)境信息
pipenv --py # 顯示Python解釋器信息
pipenv install XXX # 安裝XXX模塊并加入到Pipfile
pipenv install XXX==1.11 # 安裝固定版本的XXX模塊并加入到Pipfile
安裝 jieba 庫,,并查看Pipfile變化:
pipenv graph # 查看目前安裝的庫及其依賴
在虛擬環(huán)境中安裝了jieba和requests兩個(gè)庫:
pipenv check # 檢查安全漏洞
pipenv update --outdated # 查看所有需要更新的依賴項(xiàng)
pipenv update # 更新所有包的依賴項(xiàng)
pipenv update <包名> # 更新指定的包的依賴項(xiàng)
檢查需要更新的包并更新:(如果所有包依賴都為最新版,,再執(zhí)行更新時(shí),將不會(huì)有變化)
pipenv uninstall XXX # 卸載XXX模塊并從Pipfile中移除
pipenv uninstall --all # 卸載全部包并從Pipfile中移除
pipenv uninstall --all-dev # 卸載全部開發(fā)包并從Pipfile中移除
卸載jieba庫,,并查看Pipfile文件變化:
exit # 退出當(dāng)前虛擬環(huán)境
退出虛擬環(huán)境,,命令行提示符前綴消失:
pipenv --rm # 刪除虛擬環(huán)境
刪除虛擬環(huán)境之后,再次運(yùn)行pip shell 會(huì)發(fā)現(xiàn)先為這個(gè)project創(chuàng)建虛擬環(huán)境,,然后再打開shell:
- requirements.txt 文件的兼容
- pipenv可以像virtualenv一樣用命令生成requirements.txt 文件:
pipenv lock -r > requirements.txt # 將Pipfile和Pipfile.lock文件里面的包導(dǎo)出為requirements.txt文件
pipenv lock -r --dev > requirements.txt # 將Pipfile和Pipfile.lock文件里面的開發(fā)包導(dǎo)出為requirements.txt文件
- pipenv 通過requirements.txt安裝包:
pipenv install -r requirements.txt
pipenv install -r --dev requirements.txt # 只安裝開發(fā)包
- Python 文件的運(yùn)行
- 方式一: pipenv run python xxx.py
pipenv run python xxx.py
# 進(jìn)入激活環(huán)境
pipenv shell
# 運(yùn)行文件
python xxx.py
|