­

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的一些主要的使用方法:

  1. pipenv --two/--three:使用Python 2或Python 3創建一個虛擬環境並新建Pipfile,它會探測系統中安裝的所有Python並自動選擇對應的Python版本。
  2. pipenv install:從當前的Pipfile安裝所有依賴
  3. pipenv install --deploy:從Pipfile.lock安裝所有依賴,部署用
  4. pipenv lock:從當前的Pipfile生成Pipfile.lock
  5. pipenv install <package_name>:安裝新的依賴包、添加到Pipfile中,並lock
  6. pipenv update:使用最新可用版本更新Pipfile.lock並安裝
  7. pipenv shell:激活虛擬環境的shell
  8. pipenv run <command>:在不激活虛擬環境時運行虛擬環境中的命令

其他用法參考文檔:https://docs.pipenv.org/