現代化 Python 專案管理!PDM 與 uv 的組合拳(附專案模板)

目錄

今天將會介紹 PDM 與 uv 這兩款 Python 套件管理工具,並且附上一個本人實作的專案模板。

想起最初開始學習 Python 時,專案管理對我來說還是個陌生的概念。一直以來都是用 pip install 來安裝所有需要的套件。

只到後來認真開始開發專案,就會發現遇到幾個常見的問題:

  1. 專案越來越大,需要安裝許多的套件,開始出現套件版本衝突的問題。而且還是跟目前專案根本沒用到的套件起衝突。
  2. 不同專案開始用到一些套件需要指定的 Python 版本,但目前電腦的 Python 版本不合,又不可能把目前的 Python 刪掉。

所以這個時候就需要專案管理器來幫我們解決這些問題。

Conda 是個很棒的工具,但對於 Python 專案管理來說,我覺得有點過於龐大。

據我所知 Conda 可以管理並隔離完整的虛擬環境,把包含 Python、R、或其他語言的套件都隔離在虛擬環境中。

但他的使用方式是在啟動虛擬環境後,所有的指令就會是用指定的虛擬環境執行。

比如講先 conda activate env1 進入環境,然後所有 python any.py 指令都會是使用 env1 環境中的 Python 版本。

我更喜歡的設計是讓每個專案都有自己的虛擬環境,而且最好虛擬環境放置在專案目錄下,完整的分離。刪除專案時,虛擬環境也會一起刪除。

這樣的設計可以讓我更方便的切換與管理專案。

PDM 是個現代化的 Python 專案管理器,他可以讓我們更方便的建立、管理、與使用虛擬環境。

在使用 pdm init 建立專案時,他會詢問專案的相關資訊(比如講指定的 Python 版本)並且建立虛擬環境。

PDM 是使用 pyproject.toml 進行設定,我們可以同時把 mypyruff 等常見 Python 開發工具的設定也都放在同一個檔案中統一管理!

  • pdm init 初始化專案
  • pdm add <package> 安裝套件
  • pdm remove <package> 移除套件

而且 PDM 在 remove 套件時,也會同步把虛擬環境中不再需要使用的依賴套件移除!不像 pip,在 pip uninstall 時只會移除指定的套件本身,相關的依賴套件還是會留在虛擬環境中。

在初始化專案時,PDM 會詢問我們需要使用的 Python 版本。其中列出的版本都是電腦中已安裝的 Python 版本。 我們也可以透過 PDM 來幫我們安裝目前沒有的 Python 版本。

1
pdm python install --list

以上這個指令會列出所有可供下載的 Python 版本,可能會列出像 cpython@3.13.1pypy@3.10.14 這樣的版本,其中 cpython 開頭的版本就是 CPython,也就是最常見、在官網會下載到的 Python。

我們可以透過 pdm python install cpython@3.13.1 來安裝 3.13.1 版本的 Python。需要不同的版本就直接替換掉 cpython@3.13.1 即可。

安裝好後,我們就可以在 pdm init 時選擇安裝好的 Python 版本了!

當需要使用虛擬環境時:

  • pdm run <command> 使用虛擬環境執行指令

比如講 pdm run jupyter lab 就會是使用虛擬環境中的 Jupyter Lab。

pdm run python any.py 就會是使用虛擬環境中的 Python 版本執行 any.py 檔案。(順帶一提,如果是要執行 Python 指令的話,也可以呼略 python 的字樣,直接用 pdm run any.py 來執行)

通常我們會將虛擬環境資料夾 .venv 放到 .gitignore 中,避免將虛擬環境的資料夾提交到版本控管中。 當我們換一台電腦進行開發時,只要執行 pdm install 就會在新電腦上建立虛擬環境,並且安裝所有套件!

uv 是一款 Astral 使用 Rust 開發的 Python 套件管理工具。基本上是目前市面上解析/下載套件套快的套件管理器。

他的使用方式跟 PDM 有些相似,但功能沒有那麼齊全。而且在已經有 pyproject.toml 的情況下:

  • pdm init:會進行初始化專案,設定 Python 版本等,但保留原先其他插件的設定
  • uv init:直接報錯

所以我還是使用 PDM 指令為主。

但很棒的是!PDM 自 2.19.0 版本開始,支援使用 uv 作為套件解析及安裝的工具。 只要進行一次全局設定,就可以讓電腦中的 PDM 使用 uv 來進行套件安裝解析。

1
pdm config use_uv true

PDM 就會自動尋找電腦中的 uv 工具。

如此一來就可以同時擁有 PDM 的專案管理功能,以及 uv 的套件安裝速度!

在 Python 專案開發中,我通常會用到以下的一些工具:

  • PDM :專案管理
  • uv :套件管理(透過設定讓 PDM 間接使用,而不是直接使用 uv 指令)
  • ruff :同樣由 Astral 開發的靜態程式檢查工具
  • mypy :型別檢查

另外 Jupyter lab 也是我常用的 Python 開發工具之一,所以我也幾乎都會順便安裝。

我在 Github 建立了一個 template repo,並且把常用的設定都寫在 pyproject.toml 中。

有興趣的可以前往 Python Project Template 查看!

  1. 在電腦中安裝 PDM 與 uv(可選,若有安裝 uv 記得設定 pdm config use_uv true
  2. 在 VSCode/Cursor 中安裝 Python、Pylance、Jupyter、Ruff、Mypy (By Matan Gover) 等套件
  3. 將模板 Clone 到想開發的地方
  4. 在專案根目錄執行 pdm init 初始化專案並且選擇需要的 Python 版本
  5. 執行 pdm update 安裝包含 ruff、mypy 及 jupyterlab 等模板預設的套件
  6. 快樂開發

仔細想來我也是摸索了一段時間才慢慢找到適合自己的 Python 開發流程/專案管理方式。

希望這篇文章能夠幫助到正在學習 Python 的你!歡迎使用我的 Template,也可以考慮建立一個專屬於你自己的專案模板喔!