Python包管理工作流
- 2019 年 11 月 30 日
- 筆記
使用requirements.txt管理依賴
pip最普通的使用方法就是pip install <package_name>
,如果要指定版本,可以用pip install <package_name>==<version>
。如果你的應用中包含很多條依賴,可以把這些依賴都寫在一個requirements.txt
文件中,就像這樣:
Django==1.11.2 requests>=2.11.0 simplejson ordereddict
其中既有指定版本號的,也有忽略版本號的。然後你就可以用:pip install -r requirements.txt
來安裝所有依賴。requirements.txt
本質上是一個純文本文件,但它還支援其他特性,比如包含另一個requirements.txt
,這就使得模組化成為可能:
-r web.txt -r secure.txt simplejson ordereddict
有了內部PyPI鏡像,安裝依賴將會變得非常簡單。那麼問題來了:如果我想要升級依賴的版本呢?
對於忽略版本號的依賴,當然沒問題,全新安裝時,自動會選擇當前最新版本,但對於指定了版本號的,則需要手動更新這些版本號,然後重新安裝。
使用虛擬環境
現在升級好了,一運行,你發現其他服務掛了,這是因為其他服務可能不兼容新版的依賴。這非常有可能發生,A應用依賴v1.0,B應用依賴v2.0,你一升級,A就用不了了。如果把A應用和B應用環境獨立,裝兩份不同版本的依賴,不就沒問題了?沒錯,要達成這一目的,你可以裝兩份Python,然後分別使用Python下的pip安裝,就會安裝到不同路徑,運行應用時,指定不同的Python路徑就可以了。但這樣未免太過煩瑣,於是virtualenv大展身手的時機來了。
Virtulenv會使用當前的Python解釋器創建出一個虛擬環境,並把Python解釋器拷貝一份到環境中,這個拷貝,比起編譯安裝一個新的會省不少資源。使用時,需要事先激活這個虛擬環境,把當前的Python指到這個環境中的Python:
創建虛擬環境
$ virtualenv venv ... $ cd venv
激活環境
$ source venv/bin/activate (venv)$
後續的pip安裝、啟動應用,只要在這個虛擬環境中運行即可。也可以不激活,通過絕對路徑使用它:
$ /home/frostming/myproject/venv/bin/python server.py
Pipenv: pip + virtualenv
有了虛擬環境,依賴衝突的問題解決了,但還有一個問題仍未解決:更新版本號,如果你想更新依賴包,對於那些在requirements.txt
中指定了版本號的依賴,你得逐個檢查是否有新版,然後更新。既然如此麻煩,那是不是全都忽略版本號就好了?非也,這會產生新的問題。你在開發機上驗證完畢了,部署到生產機上,或者別的小夥伴喜歡這個應用,想在自己的機器上跑。這時使用無版本號的requirements.txt
安裝依賴,很可能安裝的版本和你開發時不一樣,結果導致應用不可用。
但仔細分析,requirements.txt
中是否指定版本號,解決的是兩個維度的問題:
- 無版本號是為了方便你更新依賴時自動拉取最新版本。(A型)
- 有版本號是為了部署和開發時的環境完全一致。(B型)
但requirements.txt
只有一份,手動維護兩份requirements
成本又過高。於是Pipenv就應運而生,它可以從A型的requirements.txt
(Pipenv使用了一種新的格式Pipfile)生成B型的文件,稱為Pipfile.lock,鎖定當前所有依賴的版本。部署時,從Pipfile.lock安裝,這些理念,是從其他語言的包管理工具借鑒過來的。
除此之外,Pipenv還會幫你管理虛擬環境,不用自己創建。
Pipenv的一些主要的使用方法:
pipenv --two/--three
:使用Python 2或Python 3創建一個虛擬環境並新建Pipfile,它會探測系統中安裝的所有Python並自動選擇對應的Python版本。pipenv install
:從當前的Pipfile安裝所有依賴pipenv install --deploy
:從Pipfile.lock安裝所有依賴,部署用pipenv lock
:從當前的Pipfile生成Pipfile.lockpipenv install <package_name>
:安裝新的依賴包、添加到Pipfile中,並lockpipenv update
:使用最新可用版本更新Pipfile.lock並安裝pipenv shell
:激活虛擬環境的shellpipenv run <command>
:在不激活虛擬環境時運行虛擬環境中的命令
其他用法參考文檔:https://docs.pipenv.org/