Python依賴管理那點事


學Python有段時間了,學的時候會想着拿它和Java對比。

  • 在對比的時候,發現 Java 有很成熟的項目構建工具,有使用 xml 的 Maven,也有使用 groovy 的 Gradle,這樣的構建工具能夠自動處理項目的依賴,很是方便。
  • 對於Python,在依賴管理方面,從一個初學者的角度看,嗯,只能說,貴圈真亂!(本文純屬個人觀點,不喜勿噴) 好吧,讓我們捋一捋。
    • 在包管理方面,聽說現在在役的包管理工具有 distutils、 setuptools、 distribute、 distlib、 pip,真讓人眼花繚亂。幸運的是,現在貌似有setuptools和pip就已經足夠了。
    • 在項目依賴隔離方面,Python主要使用虛擬環境,而關於虛擬環境的模塊,pyenv、 venv、 virtualenv、 virtualenvwrapper,也是叫人看到頭皮發麻!
    • 此外,很多 Python庫使用了 C/C++語言,即使 Python 只是一個小版本的更新,對應的庫也需要完全重新編譯一次,也就是說不同小版本的 Python 的依賴也不一定能兼容。
    • 還有就是版本問題(一直認爲是個大坑!),很多時候,我們都希望能用一個工具來在兩個版本間靈活地切換,並分別管理它們的依賴。
  • 雖然存在衆多不足,但可以看到的是,Python依然在往好的方向發展,比如目前的終極解決方案pipenv,其出現讓Python的依賴管理逐漸優雅和簡單。下面來總結一下我覺得比較有用的依賴管理工具,希望可以讓和我一樣的初學者在依賴管理方面少走一些彎路。

pip

​ 之前我曾寫過關於pip使用的,pip的基本使用。但如果在做項目時,只會使用pip intall來管理包,用久了會發現各個項目的模塊雜揉到一起,很是混亂,還可能會導致各種奇怪的錯誤,因爲pip安裝好的模塊全都在一個全局的模塊庫中,無法實現項目間的依賴隔離。顯然,pip在包管理方面很好用,但在要隔離項目間的依賴,還需要使用別的工具,比如virtualenv

virtualenv

在使用virtualenv處理項目依賴時,我們通常會使用virtualenv創建一個虛擬環境,再創建一個依賴包列表requirements.txt,然後他們可以使用 pip進行安裝。這種方法一般都會工作正常,但有時它會表現出一些怪異行爲。下面是其使用時的一些缺陷。

缺點

  • 你可能得手動安裝或刪除某些特定版本的包,並記得定期更新requirements.txt文件,以保持項目環境的一致。特別是當你想要在你的虛擬環境中安裝Python包,但它不一定與項目本身相關聯的時候。
  • 此外,一些項目有時會保留requirements.txt文件的兩個版本——一個用於開發環境,一個用於生產環境,這可能會導致更多的複雜性。

Pipenv

不得不說,在項目包管理方面,Python確實存在不少的坑。直到Pipenv的出現,Python的依賴管理才逐漸變得優雅起來。Pipenv是官方推薦的的python包管理工具,它旨在將所有包管理工具(如bundler, composer, npm, cargo, yarn等)的優點集中應用於python領域。

下面是其主要優勢:

  1. 集成了pip,virtualenv兩者的功能,且完善了兩者的一些缺陷。
  2. 支持Python2 和 Python3,在各個平臺的命令都是一樣的。
  3. 過去用virtualenv管理requirements.txt文件可能會有問題,Pipenv使用Pipfile和Pipfile.lock,後者存放將包的依賴關係,查看依賴關係是十分方便。
  4. 各個地方使用了哈希校驗,無論安裝還是卸載包都十分安全,且會自動公開安全漏洞。
  5. 通過加載.env文件簡化開發工作流程。

總結

  • 如果需要將庫安裝到全局系統,我們還是需要使用pip;
  • 管理項目依賴方面,pipenv是目前的終極解決方案;
  • 如果需要維護使用virtualenv的項目,也可以使用pipenv,因爲兼容virtualenv,並且virtualenv項目可以方便地遷移到pipenv。

最後, 個人建議,保持簡單,擁抱pipenv吧!
關於Pipenv的使用,可以看一下我的另一篇文章, Pipenv使用入門

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章