愛伊米

收藏!四個 Python 專案管理與構建工具

Python 歷時這麼久以來至今還未有一個事實上標準的專案管理及構建工具,以至於造成 Python 專案的結構與構建方式五花八門。這或許是體現了 Python 的自由意志。

不像 Java 在經歷了最初的手工構建,到半自動化的 Ant, 再到 Maven 基本就是事實上的標準了。其間 Maven 還接受了其他的 Gradle(Android 專案主推), SBT(主要是 Scala 專案), Ant+Ivy, Buildr 等的挑戰,但都很難撼動 Maven 的江湖地位,而且其他的差不多遵循了 Maven 的目錄佈局。

回到 Python,產生過 pip, pipenv, conda 那樣的包管理工具,但對專案的目錄佈局沒有任何約定。

關於構建很多還是延續了傳統的 Makefile 的方式,再就是加上 setup。py 和 build。py 用程式程式碼來進行安裝與構建。關於專案目錄佈局,有做成專案模板的,然後做成工具來應用專案模板。

下面大概瀏覽一下四個工具的使用

CookieCutter

PyScaffold

PyBuilder

Poetry

CookieCutter 一個經典的 Python 專案目錄結構

最後由 cookiecutter 生成的專案模板是下面的樣子:

這大概是當前比較流行的目錄結構的主體框架,主要元素是:

專案 sample 目錄中重複 sample 目錄中放置 Python 原始檔, 目錄中是測試檔案,再加一個 目錄放文件,README。rst, 其他的用於構建的 setup, setup。cfg 和 Makefile 檔案。

這其實是一個很經典的 Python 專案結構,接下來的構建就用 命令了,輸入 會看到定義在 Makefile 檔案中的指令

為使用上面的構建過程,需要安裝相應的包,如 , , , , , 它們都可以透過   來安裝。之後就可以 , , , 等。其中 可以生成一個很漂亮的 Web 文件。

PyScaffold 建立一個專案

PyScaffold 顧名思義,它是一個用來建立 Python 專案腳手架的工具,安裝和使用:

這樣建立了一個 Python 專案,目錄結構與前面  cookiecutter 所選的模板差不多,只不過它把原始檔放在了 目錄,而非 目錄。

能顯示出定義在 中所有的任務:

要執行哪個命令便用 , 等, 下面是如何使用 PyScaffold 的動圖:https://yanbin。blog/wp-content/uploads/2021/09/pyscaffold-demo。gif

PyBuilder

最好再看另一個構建工具 PyBuilder, 它所創建出的目錄結構很接近於 Maven, 下面來瞧瞧

完後看下它的目錄結構:

構建過程仍然是用 命令,可用 檢視幫助, 列出所有的任務, PyBuilder 的任務是以外掛的方式加入的,外掛配置在   檔案中。

PyBuilder 也是在構建或測試之前建立虛擬環境, 從 0。12。9 版開始可透過引數 跳過建立虛擬環境這一步。使用了 的話 Python 程式碼將會在執行   的當前 Python 環境中執行,所需的依賴將要手工安裝。

專案的依賴也要定義在 檔案中

隨後在執行 建立虛擬環境時就會安裝上面的依賴,並在其中執行測試與構建。

Poetry

最後一個 Poetry, 感覺這是一個更為成熟,專案活躍度也更高的 Python 構建,它有著更強大的信賴管理功能,用 就能新增依賴, 顯示出依賴樹。看下如何安裝及建立一個專案

它建立的專案比上面都簡單

如果給 帶上 引數,那麼原始檔目錄 會放在 目錄下,即 。

會在當前目錄中生成 檔案,目錄等的生成需手動完成。

它不關注文件的生成,程式碼規範的檢查,程式碼覆蓋率都沒有。它的專案配置更集中,全部在 檔案中, 是什麼呢?它是一種配置檔案的格式 Tom‘s Obvious, Minimal Language (https://github。com/toml-lang/toml)。

有些類似 NodeJS 的 檔案,比如 poetry add, poetry install 命令的行

其他主要的

能執行任何系統命令,只是它會在它要的虛擬環境中執行。所以可以想見, 的專案要生成文件或覆蓋率都必須用 命令來支援 , 或 。

在 sample 目錄(與 pyproject。toml 檔案平級)中建立檔案 , 內容為

然後在 中寫上

再執行

就會輸出 “hello poetry”。

透過對以上四個工具的認識,專案結構的複雜度由 cookiecutter-pyproject -> PyScaffold -> PyBuilder -> Poetry 依次降低,使用的難度大略也是相同的順序。

參考連結

Set up tests, linters and type checking in Python projects in 2020 (https://medium。com/@cristobalcl/set-up-tests-linters-and-type-checking-in-python-projects-in-2020-9cc1b1e2750d) (介紹了 poetry 專案如何支援 coverage, lint 和 type checking)

Dependency management tools for Python (https://snyk。io/blog/dependency-management-tools-python/)

連結:https://yanbin。blog/python-dependency-management-build-tools