Site icon Mr. 沙先生

pip, pipenv 和 poetry 的選擇

最近在找一些適合 Python 管理套件的方案,之前在其他語言都有接觸像 npm (Node.js), composer (PHP), maven (Java) 等管理相依性套件的工具,但是 Python 的主流一直是以 pip 為主,但是 pip 那個陽春的功能在這個時代幾乎可以拿去丟了 … 在這篇會做一些整理以及分析提供參考

找了一下社群看到 pip, pipenvpoetry 這三個專案,簡單做一下比較

pip

最老牌的 Python 原生套件管理工具,主要使用 requirements.txt 檔案控制套件版本,有最基本的版本處理方法:

# requirements.txt
boto3==1.13.14
regex<=2020.1.8
requests>=1.0, <2.0

但是沒有辦法很優雅的處理套件之間的相依性,是一直以來被垢病的原因。

pipenv

繼 pip 之後,讓 Python 開發人員最開心的一個專案,實現了和其他語言相同的 lock file (Pipenv.lock) 處理軟體相依性問題以及 virtual env,可以說是 Python 的救星。

但是也從社群找到一些令人垢病的問題,從 gslin「pipenv 的凋零與替代方案 poetry」這裡看到 “If this project is dead, just tell us“,得知 pipenv 現在專案的經營狀況頗令人擔憂,PR 都沒有被正式 release 而是放在 master branch (?) 讓很多的貢獻者抱怨炸翻天。

除此之外也有許多小問題,不過大多不礙事,但評價這麼差的狀況也是前景堪慮啊 …

poetry

poetry 是除了 pipenv 之外最推薦的 Python 管理工具,但是這個專案非常年輕,從 release 記錄來看,第一版在 2018/02 直到目前才在 1.1 版本,但 poetry 除了年紀較輕之外,看起來就是衝著 pipenv 來的,除了 pipenv 原有功能以外更多了其他

poetry 主要是依賴 pyproject.toml 設定所有參數,然後使用 poetry.lock 鎖定版本套件,就像 npm 的 package.json 一樣。

總結

主選 poetry 的原因是希望一個 pyproject.toml 可以搞定很多事情,而不是安裝一堆套件來處理,反而會要處理更多套件之間的相依性,而套件管理工具選擇較年輕比較不會有問題,因為即使要換掉也不會花掉很大的功夫。

Exit mobile version