關於 pip 的前世今生、它的歷史包袱,以及為何它難以演化成理想的、可以完美管理套件相依性的模樣,可以參考〈告別 Anaconda:在 macOS 上使用 pyenv 建立 Python 開發環境〉中推薦過的單集 Podcast:

從 Podcast 官方頁面中「時間節點」目錄中可知,該集對 Python 的虛擬環境與套件管理機制及相關工具,有著非常廣泛的討論,十分精彩,強力推薦!(為了寫這篇又聽了第 3 次)

pythonhunter.org/episodes/ep15

pythonhunter.org/episodes/ep15

Pipenv vs Poetry

因為 pip 存在這樣的致命弱點,所以很早就有相關的方案提出想要解決它,最知名的莫過於 Pipenv

而講到需要有充分「套件相依性管理」功能的套件管理器,你基本上也只能從 Pipenv 和 Poetry 兩者之中二擇一了。

如果是在兩年前,這道選擇題恐怕不容易回答,且 Pipenv 可能會有較大的機率勝出,但兩年後的今天,我會建議你毫不猶豫地選擇 Poetry。

選擇 Poetry 的兩個理由

怎麼說呢?以下是我的理由。

理由一:Pipenv 的不足

當你搜尋「python poetry」關鍵字的時候,那些教你怎麼使用 Poetry 的文章,往往也會一併提及為何不選擇 Pipenv。

以下兩篇有著較為完整的說明,容我直接引用。

Python - 取代 Pipenv 的新套件管理器 Poetry〉:

Pipenv 雖然強大,卻也暴露出了一些問題如 Lock 過慢、Windows 支援性差、對 PyPI 套件打包的友善度差…等更多其他問題,甚至有越來越多人表明 不要使用 Pipenv 或 pipenv 的凋零與替代方案 poetry 等。

同時 Pipenv 的社群維護狀況也越來越差,有許多的 PR 都沒有被 Release,導致許多貢獻者抱怨,甚至有人發出了該篇 If this project is dead, just tell us issue 想知道是否專案已經不在維護。

相比 Pipenv,Poetry 是一個更好的選擇〉(本文作者李輝為 Flask 團隊成員):

Pipenv 描繪了一個美夢,讓我們以為 Python 也有了其他語言那樣完善的包管理器,不過這一切卻在後來者 Poetry 這裡得到了更好的實現。

這幾年 Pipenv 收獲了很多用戶,但是也暴露了很多問題。雖然 Lock 太慢、Windows 支援不好和 bug 太多的問題都已經改進了很多,但對我來說,仍然不能接受隨時更新鎖定依賴的設定,在上一篇文章《不要用 Pipenv》裡也吐槽了很多相關的問題。

兩篇的引述內容總結就是一句話:「不要用 Pipenv。