Python 專案打包與虛擬環境:Poetry 與 pyproject.toml (第 25 章)

站主自己的課程,請大家支持
揭秘站長的架站心法:如何利用 Hugo × AI 打造高質感個人品牌網站? 揭秘站長的架站心法:如何利用 Hugo × AI 打造高質感個人品牌網站?
  • Post by
  • Jan 08, 2024
post-thumb

在學習 Python 的初期,我們可能習慣直接用 pip install 把套件裝在全域環境。但隨著專案變多,你會發現:“A 專案需要 Django 3.0,B 專案需要 Django 4.0”,這時候全域環境就炸裂了 (Dependency Hell)。

解決方案就是 虛擬環境 (Virtual Environments):為每個專案建立獨立的 Python 樂園。

1. 內建工具:venv

Python 3.3+ 內建了 venv 模組,是最輕量的選擇。

建立與啟用

# 建立名為 .venv 的虛擬環境 (Mac/Linux)
python3 -m venv .venv

# 啟用環境
source .venv/bin/activate

# 啟用後,你的終端機提示字元前會出現 (.venv)
# 這時 pip install 只會裝在這個目錄下
pip install requests

# 離開環境
deactivate

匯出依賴

# 將當前環境的所有套件版本寫入檔案
pip freeze > requirements.txt

# 別人拿到你的專案時,安裝依賴
pip install -r requirements.txt

venv 雖然好用,但它無法解決「依賴的依賴」衝突問題,且 requirements.txt 管理起來有些簡陋。

2. 現代化神器:Poetry

Poetry 是目前 Python 社群最推薦的依賴管理與打包工具。它使用 pyproject.toml 這個新一代標準設定檔,解決了 setup.py, requirements.txt, Pipfile 分散的問題。

安裝 Poetry

curl -sSL https://install.python-poetry.org | python3 -

初始化專案

# 在現有專案中初始化
poetry init

# 它會引導你設定專案名稱、版本、作者等,並自動建立 pyproject.toml

新增套件

# 安裝 requests,Poetry 會自動解決版本衝突並更新 pyproject.toml
poetry add requests

# 安裝開發才用的套件 (如 pytest, black)
poetry add --group dev pytest

執行程式

Poetry 會自動管理虛擬環境,你不需要手動 activate。

# 在虛擬環境中執行 script.py
poetry run python script.py

Poetry vs Pipenv

雖然 Pipenv 曾經很紅,但 Poetry 在打包發布 (Publish to PyPI)依賴解析速度 上表現更好,且格式更符合 PEP 標準。

3. 什麼是 pyproject.toml

這是一個 TOML 格式的設定檔,旨在統一 Python 專案的配置。以後包含 Black (格式化)、Isort (排序 import)、Pytest (測試)、Mypy (型別) 的設定,通通都可以寫在這個檔案裡!

範例:

[tool.poetry]
name = "my-awesome-project"
version = "0.1.0"
description = ""
authors = ["Weichih <weichih@example.com>"]

[tool.poetry.dependencies]
python = "^3.10"
requests = "^2.31.0"

[tool.poetry.group.dev.dependencies]
pytest = "^7.4.0"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

4. 總結

一個專業的 Python 專案,必備以下結構:

  1. 虛擬環境:隔離依賴,不汙染系統。
  2. pyproject.toml:單一設定檔管理所有工具。
  3. 鎖定檔 (poetry.lock):確保所有人安裝的套件版本 100% 一致。

Batch 5 (Modern Python Development) 重點回顧:

  • Ch 21: Type Hints 讓程式碼更健壯。
  • Ch 22: Threading vs Multiprocessing 征服並發。
  • Ch 23: AsyncIO 榨乾單執行緒效能。
  • Ch 24: Requests 串接 API。
  • Ch 25: Poetry 與 venv 管理專案。

恭喜你!你已經具備了中高階 Python 開發者的實力。你可以寫出效能好、結構佳、易維護的現代化 Python 程式碼了。

下一階段,我們將進入 Batch 6 (Data Science & AI Foundations),這是 Python 最發光發熱的領域!我們將探索 NumPy, Pandas 與 Matplotlib。


延伸閱讀

LATEST POST
TAG