Python 现代工程实践

工具选择

依赖管理 uv / uv.lock
构建配置 pyproject.toml
环境变量 Pydantic Settings
代码检查 Ruff

工具安装

安装 uv

arduino 复制代码
curl -LsSf https://astral.sh/uv/install.sh | sh

初始化项目

bash 复制代码
uv init my_app 
cd my_app

或者在已有项目里执行:

bash 复制代码
uv init

修改 pyproject.toml 的配置

Python 版本

toml 复制代码
requires-python = ">=3.11"

添加依赖

toml 复制代码
dependencies = [  
    "requests>=2.31.0",  
    "numpy",  
]

添加/删除依赖还可以通过命令行(也会同步更新 pyproject.toml)

bash 复制代码
uv add requests numpy pandas
uv remove requests

让修改生效

bash 复制代码
uv sync

选择什么样的第三方库版本

!TIP 要写 >= 或者更智能的范围符号而非 ==,每次你执行 uv sync 甚至重新安装时,工具都能在不破坏你代码的前提下,默默帮你升级到最安全的补丁版本。

更推荐的写法:波浪号 ~= 或者脱字符 ^。 例如 requests = "^2.31.0",它的意思是: "大于等于 2.31.0,但必须小于 3.0.0"(允许安全和特性更新,但拒绝破坏性的大版本更新)。

最小工程结构

bash 复制代码
my_agent_system/
├── app/
│   ├── __init__.py
│   ├── core/
│   │   ├── __init__.py
│   │   └── config.py        # 环境变量,用 BaseSettings 代替 constants.py
│   └── main.py
├── .env                     # 绝密文件:存真实的 API Key(绝对不能进 Git!)
├── .env.example             # 模板文件:告诉同事需要配哪些变量(提交到 Git)
├── .gitignore               # 门神:必须在这里面写上 .env
├── pyproject.toml           # 工程依赖和配置
└── uv.lock

.env

铁律 :这个文件永远、永远、永远 不能被 git commit 提交到代码仓库!

ini 复制代码
# .env 文件内容示例
DATABASE_URL="postgresql://user:password@localhost:5432/mydb"
OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxxx"
MAX_RETRIES=5

.gitignore

为了防止你手滑把 .env 传上去,你必须在根目录的 .gitignore 文件里加上一行:

markdown 复制代码
# .gitignore 文件内容
.env
.venv/
__pycache__/****

.env.example

既然 .env 不能传给别人,那新同事拉取代码后,怎么知道项目需要配哪些环境变量才能跑起来呢? 这就是 .env.example 的作用。它是一个空模板必须提交到 Git。

ini 复制代码
# .env.example 文件内容示例
DATABASE_URL=""
OPENAI_API_KEY="在这里填入你的 API Key"
MAX_RETRIES=3

app/core/config.py

python 复制代码
# app/core/config.py
from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    # 如果没配这俩,项目启动瞬间直接报错崩溃,防止带着残缺的配置运行!
    DATABASE_URL: str
    OPENAI_API_KEY: str 
    
    # 带有默认值,如果在 .env 里配了,就会被覆盖。而且自动把字符串转成 int!
    MAX_RETRIES: int = 3 

    class Config:
        # 告诉 Pydantic 去哪里找配置
        env_file = ".env" 

# 全局实例化一次
settings = Settings()

最小 pyproject.toml 模板

toml 复制代码
[project]
name = "project name"
version = "0.1.0"
description = "my project description"
readme = "README.md"
requires-python = ">=3.11" # 锁定最低 Python 版本

dependencies = [
	# --- 1. 核心基建底座 ---
    "pydantic>=2.6.0",          # 数据校验
    "pydantic-settings>=2.2.0", # 环境变量
    "httpx>=0.27.0",            # 网络请求
    "loguru>=0.7.0",            # 日志系统
    
    # --- 2. Web 服务基座 ---
    "fastapi>=0.110.0",
    "granian>=0.9.0",           # (或 uvicorn) Rust 驱动的极速 Web 服务器
    "sse-starlette>=2.0.0",     # 让 FastAPI 支持大模型打字机流式输出
    "python-multipart>=0.0.9",  # 允许 Agent 接收用户上传的 PDF/图片
    #...
    
    # --- 3. AI Agent ---
    "langgraph>=0.0.30",
    "langchain-core>=0.1.30",   # 提供标准的消息结构 (HumanMessage等)
    "langsmith>=0.1.0",         # Agent 思考链路的调试透视镜
	#...
]

[dependency-groups]
dev = [
    "pytest>=8.0.0",
    "ruff>=0.3.0",
]
相关推荐
SamChan9041 分钟前
用Python+Requests批量翻译PDF:从脚本到调度
后端·python·microsoft·ai·pdf·机器翻译
草莓熊Lotso42 分钟前
【LangChain】核心技术:嵌入模型与向量存储完全指南
服务器·网络·python·langchain
leisoo80978 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
WangYan20229 小时前
基于XGBoost与AI的生态—地学多源数据建模:植被与土地利用识别、土壤碳氮空间预测、生物多样性驱动机制、土壤微生物功能预测、生态退化与风险识别
python·机器学习·xgboost
金銀銅鐵11 小时前
[Python] 借助 turtle 逐字展示唐诗《金缕衣》
python
Python大数据分析@13 小时前
使用大模型MCP采集数据,爬虫已经无门槛
python·网络爬虫
quantdash_cc13 小时前
告别自建 Requests/BS4 网页爬虫:基于 QuantDash 搭建零维保的高性能量化行情流水线
开发语言·爬虫·python·pandas·量化·quantdash
65岁退休Coder13 小时前
LangChain v1.3.4 笔记 - 07 补充:链式调用 LCEL
后端·python·langchain
卷无止境14 小时前
FastAPI 部署在 Nginx 后面到底该怎么配
后端·python
半亩码田14 小时前
C#转Python第3.1篇:Python 的 class 没有访问修饰符?面向对象的另一条路
开发语言·python·c#