初見 PDM,一套現代化的 Python 依賴管理工具
在編寫 Python 程式時,許多人通常會使用 venv 虛擬環境來管理專案的依賴套件。雖然這樣的作法可以避免不同專案之間的套件相互干擾,但對於具有 PHP 或 Node.js 開發經驗的人來說,他們可能會好奇為什麼 Python 沒有如同 Composer 或是 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.toml
的 dependencies
內容也會一起更新。
[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>
一致。