使用 pyproject.toml、uv、脚本与 FastAPI 构建现代 Python 项目结构
随着 pyproject.toml 成为现代 Python 项目的标准配置文件,加上 uv 作为极速、全能的依赖管理与执行工具,Python 打包与项目结构变得比以往更简单、清晰。
本篇文章展示一个精炼但可用于生产的示例项目结构,包括:
- 清晰的 package 目录
- 可运行的 Python 脚本
- 一个 FastAPI 服务
- 使用 uv 完成安装、运行与构建
📁 推荐项目结构
myproject/
├─ src/
│ └─ myproject/
│ ├─ __init__.py
│ ├─ core.py
│ ├─ script.py
│ └─ api.py
├─ tests/
│ └─ test_core.py
├─ pyproject.toml
└─ README.md
两个可运行组件:
script.py→ 简单的命令行脚本api.py→ 一个最小化 FastAPI 服务
⚙️ 最小可用的 pyproject.toml
[project]
name = "myproject"
version = "0.1.0"
description = "一个包含脚本与 FastAPI 服务的简单 Python 示例项目。"
readme = "README.md"
requires-python = ">=3.9"
authors = [
{ name="Your Name", email="you@example.com" }
]
dependencies = [
"fastapi",
"uvicorn"
]
[project.optional-dependencies]
dev = ["pytest"]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project.scripts]
myproject-script = "myproject.script:main"
[project.entry-points."uvicorn.run"]
myproject-api = "myproject.api:app"
📝 示例脚本
src/myproject/script.py
def main():
print("Hello from my project script!")
if __name__ == "__main__":
main()
创建Python 虚拟环境
uv venv --seed .venv
使用 uv 运行脚本
uv run myproject-script
或直接运行源码:
uv run src/myproject/script.py
🚀 最小 FastAPI 服务
src/myproject/api.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello from FastAPI!"}
使用 uv 运行 API 服务
uv run uvicorn myproject.api:app --reload
或使用我们定义的 entry point:
uv run uvicorn myproject-api
🧪 运行测试
uv run pytest
🧱 安装依赖
uv pip install -e .[dev]
🏗️ 构建与发布
构建:
uv build
发布:
uv publish
🎯 总结
使用 pyproject.toml + uv 的好处
- 清晰的 Python 包结构
- 快速运行脚本(
uv run) - 简洁的 FastAPI 服务入口
- 更简单、可复现的依赖管理
- 从开发到发布只需一个工具