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

還在用 requirements.txt 和 setup.py 嗎?現代 Python 開發已經進入了 pyproject.toml 時代。本章教你使用 venv 隔離環境,並介紹 Poetry 這個終極依賴管理工具。

  • Dennis
  • 2 分鐘閱讀
Python 專案打包與虛擬環境:Poetry 與 pyproject.toml (第 25 章)

在學習 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。


延伸閱讀:

📬 訂閱 most.tw 電子報

每週精選 AI 工具教學與技術乾貨,直接送到你的信箱。免費、隨時可退訂。

訂閱即表示同意收到 most.tw 電子報,隨時可一鍵退訂。

💬 有問題想討論?加 LINE 聯絡我

歡迎透過 LINE 官方帳號直接留言,我會盡快回覆你的問題。

加入 LINE 好友