初見 PDM,一套現代化的 Python 依賴管理工具

程式技術
sharkHead

在編寫 Python 程式時,許多人通常會使用 venv 虛擬環境來管理專案的依賴套件。雖然這樣的作法可以避免不同專案之間的套件相互干擾,但對於具有 PHP 或 Node.js 開發經驗的人來說,他們可能會好奇為什麼 Python 沒有如同 Composer 或是 npm 那樣的套件管理工具。

PDM logo
想要如同 npm 一般的套件管理工具?我這不就來了嗎

PDM 是一個新興的 Python 依賴套件管理工具,它提供了一個現代化的方式來管理 Python 依賴套件。

如同 Composer 的 compsoer.json,PDM 使用 pyproject.toml 來定義項目配置,並支援許多增強功能,如自定義指令和配置選項。下面會來簡單介紹如何使用 PDM 來管理專案的套件。

PDM 是用 PEP582 (Python local package directory) 為基礎所製作的套件管理工具,但 PEP582 在今年 3 月正式被 Python 指導委員會拒絕。雖然如此,PDM 仍然能用傳統的虛擬環境來管理套件。

安裝 PDM

PDM 可以使用 pip 進行全域安裝。

$ pip install pdm

如果使用 Mac OS,可以考慮使用 HomeBrew 安裝 PDM。

$ brew install pdm

初始化專案

我們在一個空的資料夾中,使用這個指令初始化一個 Python 專案。

初始化會詢問一些問題,例如 Python Interpreter 版本,要使用虛擬環境還是 PEP 582 來管理依賴套件 (虛擬環境是 PDM 預設的選項)。

$ pdm init
Creating a pyproject.toml for PDM...

Please enter the Python interpreter to use
0. /opt/homebrew/bin/python3.11 (3.11)
1. /opt/homebrew/bin/python3.10 (3.10)
2. /usr/bin/python3 (3.9)
3. /opt/homebrew/Cellar/[email protected]/3.11.2_1/Frameworks/Python.framework/Versions/3.11/bin/python3.11 (3.11)
Please select (0): 0
Using Python interpreter: /opt/homebrew/bin/python3.11 (3.11)

Would you like to create a virtualenv with /opt/homebrew/opt/[email protected]/bin/python3.11? [y/n] (y): n
You are using the PEP 582 mode, no virtualenv is created.
For more info, please visit https://peps.python.org/pep-0582/

Is the project a library that is installable?
A few more questions will be asked to include a project name and build backend [y/n] (n):

License(SPDX name) (MIT):

Author name (allen):

Author email ([email protected]):

Python requires('*' to allow any) (>=3.11):

Changes are written to pyproject.toml.

初始化完成之後會出現 pyproject.toml 檔案,專案依賴的套件會紀錄在這裡,你也可以在這裡自定義指令。

[tool.pdm]

[project]
name = ""
version = ""
description = ""
authors = [
    {name = "allen", email = "[email protected]"},
]
dependencies = []
requires-python = ">=3.11"
license = {text = "MIT"}

選擇直譯器

雖然在初始化專案時,PDM 就會請你選擇 Python 直譯器,但如果你日後要切換直譯器版本的話,可以使用下面的指令。

$ pdm use /opt/homebrew/bin/python3.11

安裝套件

可以透過以下指令幫專案安裝新的依賴套件。

$ pdm add requests

安裝完成之後,會在專案目錄底下新增一個 __pypackages__ 資料夾用來存放依賴的套件。

可以使用 tree -L 3 . 指令查看此時資料夾的目錄結構。

$ tree -L 3 .
.
├── __pypackages__
│   └── 3.11
│       ├── bin
│       ├── include
│       └── lib
├── pdm.lock
└── pyproject.toml

6 directories, 2 files

注意 __pypackages__ 這個資料夾不應該加入版本控制,請在 .gitignore 中將此資料夾排除。

此時 pyproject.tomldependencies 內容也會一起更新。

[project]

# ...

dependencies = [
   "requests>=2.28.2",
]

# ...

如果你今天是接手別人的專案,假如 pyproject.toml 檔案已經存在,可以使用下方的指令安裝依賴套件。

$ pdm install

更新套件

更新依賴套件。

$ pdm update

使用 PDM 執行 Python 程式

新增一個 src/main.py 檔案。

import requests

response = requests.get('https://api.github.com/events')

# <Response [200]>
print(response)

如果直接使用 python 執行會出現找不到 requests 套件的錯誤。

error: ModuleNotFoundError: No module named 'requests'

$ python3 src/main.py

正確執行該程式的指令如下。

$ pdm run python3 src/main.py

設定 Scripts

我們可以在 pyproject.toml 新增自己定義的指令,以剛剛 pdm run python3 src/main.py 為例子。

[tool.pdm.scripts]
start = "python3 src/main.py"

此時我們就可以將剛剛的 pdm run python3 src/main.py 簡寫成如下指令。

$ pdm run start

整合 IDE

因為 PDM 使用比較新的標準 (PEP 582),如果沒有額外設定的話,在寫程式時,IDE 會顯示找不到套件的錯誤,也無法使用 autocomplete 的功能。

官方文件有提供與各種套件整合的說明,詳細可以參考此連結

VSCode

PDM 可以安裝插件,如果要與 VSCode 整合,我們可以先安裝 PDM 的 pdm-vscode 插件

$ pdm plugin add pdm-vscode

這樣在使用 pdm init 初始化專案,或是使用 pdm use 選擇 python 直譯器時,就會生成一個 .vscode/settings.json 檔案

{
 "python.analysis.extraPaths": ["${workspaceFolder}/__pypackages__/3.11/lib"],
 "python.autoComplete.extraPaths": [
   "${workspaceFolder}/__pypackages__/3.11/lib"
 ]
}

PyCharm 或是 Intellij IDEA

__pypackages__/<major.minor>/lib 設定為 Source Root,並將 Python Interpreter 的版本設定與 <major.minor> 一致。

參考資料

sharkHead
written by
sharkHead

後端打工仔,在下班後喜歡研究各種不同的技術。稍微擅長 PHP,並偶爾涉獵前端開發。個性就像動態語言般隨興,但渴望做事能像囉嗦的靜態語言那樣嚴謹。

0 則留言