Codex CLI Python 教程(2026)— AI 驱动的 Python 开发工作流

Python 是最适合 AI 编程助手的语言之一:生态成熟、测试工具完善、类型系统明确。Codex CLI 天然理解 Python,配合正确的配置,可以大幅提升 Python 开发效率——从自动生成 pytest 测试,到修复 mypy 类型错误,再到生成完整的 Django REST API。

本教程覆盖从项目初始化到 CI/CD 自动化的完整工作流,包含大量可直接复用的提示词模板,适用于 Django、FastAPI 等主流 Python 框架。

1. 项目初始化与 AGENTS.md 配置

为 Python 项目配置 AGENTS.md 是最重要的第一步。一份详细的 AGENTS.md 文件告诉 Codex 你的项目结构、技术栈、代码规范和安全边界,从而生成更准确、更符合项目风格的代码。

以下是一个适合 FastAPI + Poetry 项目的完整 AGENTS.md 示例:

# Python Project — AGENTS.md

## 项目信息
- Python 版本:3.12
- 依赖管理:Poetry (pyproject.toml)
- 测试框架:pytest + pytest-cov
- 代码风格:Black + isort + ruff
- 类型检查:mypy (strict 模式)
- Web 框架:FastAPI 0.111

## 代码规范
- 所有函数和方法必须有类型注解(包括返回类型)
- Docstring 使用 Google 风格
- 单个函数不超过 50 行;超过时拆分
- 使用 Pydantic v2 进行数据验证

## 允许的命令
- pytest, pytest-cov
- mypy, ruff, black, isort
- poetry add/remove/install
- alembic upgrade/downgrade

## 禁止的操作
- 不得删除 migrations/(只能新增)
- 不得修改 .env(敏感信息由 pydantic-settings 管理)
- 不得降低测试覆盖率(当前 > 85%)
提示:AGENTS.md 放在项目根目录。对于 monorepo,可以在子目录添加独立的 AGENTS.md,Codex 会合并父目录和当前目录的配置,从而为不同子项目提供差异化的规则。

AGENTS.md 对 Python 项目的核心价值

2. 自动生成 pytest 测试

测试生成是 Codex CLI 在 Python 生态中最强大的应用场景之一。Codex 可以分析你的业务代码,理解函数签名和业务逻辑,自动生成覆盖正常路径、边界值和异常情况的完整测试套件。

示例 1:生成单元测试

$ codex "为 app/services/user_service.py 中的 UserService 类生成完整的 pytest 测试文件。
要求:
- 使用 pytest fixtures 和 factory_boy 生成测试数据
- 用 unittest.mock.patch 隔离数据库调用
- 每个方法至少 3 个测试:正常路径、边界值、异常情况
- 测试文件保存到 tests/services/test_user_service.py"

示例 2:提升测试覆盖率

$ codex "运行 pytest --cov=app --cov-report=term-missing,找出覆盖率低于 80% 的模块,
补充缺失的测试用例,优先覆盖核心业务逻辑路径"

示例 3:生成参数化测试

$ codex "为 app/utils/validators.py 中的 validate_email 函数生成参数化测试
(@pytest.mark.parametrize),覆盖有效邮件、无效格式、空字符串、
Unicode 字符等边界情况"

示例 4:生成 FastAPI 异步集成测试

$ codex "使用 httpx.AsyncClient 为 /api/v1/users 路由生成异步集成测试,
覆盖 GET(分页)、POST(创建,含验证错误)、PUT(更新)、DELETE(软删除)"

示例 5:Mock 外部 API 调用

$ codex "为调用 Stripe API 的 payment_service.py 编写测试,
用 pytest-mock 的 mocker.patch 模拟 stripe.PaymentIntent.create,
测试成功支付、余额不足、网络超时三种情况"

生成的测试文件结构示例(Codex 输出风格):

import pytest
from unittest.mock import patch, MagicMock
from app.services.user_service import UserService
from tests.factories import UserFactory

class TestUserService:
    """Tests for UserService — auto-generated by Codex CLI."""

    @pytest.fixture
    def service(self, db_session):
        return UserService(db=db_session)

    def test_get_user_success(self, service):
        user = UserFactory.create()
        result = service.get_user(user.id)
        assert result.id == user.id

    def test_get_user_not_found(self, service):
        with pytest.raises(UserNotFoundError):
            service.get_user(99999)

    @pytest.mark.parametrize("invalid_id", [0, -1, None])
    def test_get_user_invalid_id(self, service, invalid_id):
        with pytest.raises(ValueError):
            service.get_user(invalid_id)

3. 类型检查与 mypy 集成

Python 的类型系统在 3.10+ 版本后愈发完善。Codex CLI 可以帮助你快速修复 mypy 错误、为历史代码添加类型注解、生成符合规范的 Pydantic 模型。

示例 1:批量修复 mypy 错误

$ codex "运行 mypy app/ --strict,找到所有类型错误并修复:
- 不得使用 Any 类型绕过检查
- Optional 字段必须正确处理 None
- 泛型类型需要完整指定(如 List[str] 而非 List)"

示例 2:为历史代码添加类型注解

$ codex "为 app/legacy/data_processor.py 添加完整的 Python 3.12 类型注解:
- 分析函数的实际使用方式推断类型
- 使用 TypeVar 处理泛型函数
- 复杂数据结构使用 TypedDict 或 dataclass"

示例 3:从数据库 Schema 生成 Pydantic 模型

$ codex "根据 PostgreSQL 数据库 schema(见 schema.sql)生成对应的 Pydantic v2 模型,包含:
- 数据库模型(SQLModel)
- API 请求/响应模型(BaseModel,分别用于创建、更新、读取)
- 字段验证器(validator/field_validator)"

Pydantic v2 模型示例(Codex 生成风格):

from pydantic import BaseModel, EmailStr, field_validator
from typing import Optional
from datetime import datetime

class UserCreate(BaseModel):
    """Request model for user creation."""
    email: EmailStr
    username: str
    password: str

    @field_validator("password")
    @classmethod
    def validate_password(cls, v: str) -> str:
        if len(v) < 8:
            raise ValueError("Password must be at least 8 characters")
        return v

class UserRead(BaseModel):
    """Response model for user data."""
    id: int
    email: EmailStr
    username: str
    created_at: datetime

    model_config = {"from_attributes": True}

4. 代码风格自动化(Black / Ruff / isort)

Codex CLI 可以在修改代码的同时保持风格一致性,或专门用于批量整理历史代码库的风格问题。

示例 1:一键格式化与 Lint 修复

$ codex exec --approval-mode full-auto "运行以下命令修复格式问题,确保 CI 通过:
1. isort app/ tests/ --profile black
2. black app/ tests/
3. ruff check app/ tests/ --fix
然后运行 pytest 验证没有引入 Bug"

示例 2:审查历史代码库风格问题

$ codex "审查 legacy/ 目录下所有 Python 文件的代码风格问题:
1. 找出不符合 PEP 8 的命名(驼峰命名的变量/函数)
2. 找出过长的函数(> 50 行)
3. 找出缺少 docstring 的公开函数
生成一份 Markdown 格式的改进清单,按优先级排序"
注意:使用 --approval-mode full-auto 时,Codex 会自动执行命令而不询问确认。建议先在 Git 分支上操作,并确保 AGENTS.md 中的 allowed_commands 明确列出了格式化工具。

5. Django 项目集成

Django 是 Python 生态中最成熟的 Web 框架。Codex CLI 完全理解 Django 的 MVT 架构、ORM 语义和约定优于配置的设计哲学。

示例 1:生成 Django Model

$ codex "为博客系统创建 Django Model:
- Post(标题、内容、作者、创建时间、状态、标签多对多)
- Comment(内容、作者、帖子、父评论可空、创建时间)
- Tag(名称、slug、使用次数)
包含 Meta 类、__str__ 方法、get_absolute_url、自定义 Manager"

示例 2:生成 DRF Serializer + ViewSet

$ codex "为 BlogPost 模型创建完整的 DRF API:
- PostSerializer(嵌套 author 和 tags)
- PostViewSet(带自定义权限:作者可以编辑、所有人可以读取)
- URL 路由注册到 api/v1/posts/"

示例 3:生成 Django Migration

$ codex "Post 模型需要新增 view_count(整数,默认 0)和 featured_image
(ImageField,可为空)字段,生成对应的 Migration 文件"

示例 4:生成管理命令

$ codex "编写 Django 管理命令 management/commands/send_digest.py:
读取过去 24 小时的新帖子,发送摘要邮件给订阅用户,支持 --dry-run 参数"

示例 5:ORM 性能优化

$ codex "分析 views.py 中的 UserListView,发现以下查询问题并修复:
- N+1 查询(用 select_related/prefetch_related 解决)
- 缺少分页
- 缺少缓存(热点数据用 Django cache framework)"

Django Model 生成示例(Codex 输出风格):

from django.db import models
from django.contrib.auth import get_user_model
from django.urls import reverse

User = get_user_model()

class PostManager(models.Manager):
    def published(self):
        return self.filter(status="published")

class Post(models.Model):
    class Status(models.TextChoices):
        DRAFT = "draft", "草稿"
        PUBLISHED = "published", "已发布"

    title = models.CharField(max_length=255)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="posts")
    tags = models.ManyToManyField("Tag", blank=True)
    status = models.CharField(max_length=20, choices=Status.choices, default=Status.DRAFT)
    created_at = models.DateTimeField(auto_now_add=True)

    objects = PostManager()

    class Meta:
        ordering = ["-created_at"]
        verbose_name = "文章"

    def __str__(self) -> str:
        return self.title

    def get_absolute_url(self) -> str:
        return reverse("posts:detail", kwargs={"pk": self.pk})

6. FastAPI / 现代 Python Web 框架

FastAPI 凭借原生异步支持和 Pydantic 集成,已成为现代 Python API 开发的首选框架。Codex CLI 完全理解 FastAPI 的依赖注入系统、路由装饰器和异步生命周期。

示例 1:生成用户认证路由

$ codex "为用户认证系统创建 FastAPI 路由(app/api/v1/auth.py):
- POST /register(邮件+密码,发送验证邮件)
- POST /login(返回 JWT access/refresh token)
- POST /refresh(用 refresh token 换新 access token)
- POST /logout(黑名单 refresh token)
使用 Pydantic v2、python-jose、passlib[bcrypt]"

示例 2:依赖注入系统

$ codex "创建 FastAPI 依赖项:
- get_current_user:验证 JWT,返回用户对象或抛出 401
- get_db:SQLAlchemy async session(带自动 commit/rollback)
- require_permission(perm: str):RBAC 权限检查"

示例 3:Celery 异步任务系统

$ codex "用 Celery + Redis 实现异步任务系统:
- 发送邮件任务(带重试和指数退避)
- 图片处理任务(Pillow 压缩和 WebP 转换)
- Celery Beat 定时任务(每天凌晨 2 点清理过期 token)
包含 Dockerfile 中的 worker 启动配置"

FastAPI 依赖注入示例(Codex 生成风格):

from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from sqlalchemy.ext.asyncio import AsyncSession
from typing import AsyncGenerator

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

async def get_db() -> AsyncGenerator[AsyncSession, None]:
    """Async database session dependency."""
    async with AsyncSessionLocal() as session:
        try:
            yield session
            await session.commit()
        except Exception:
            await session.rollback()
            raise

async def get_current_user(
    token: str = Depends(oauth2_scheme),
    db: AsyncSession = Depends(get_db),
) -> User:
    """Validate JWT and return current user."""
    credentials_exception = HTTPException(
        status_code=status.HTTP_401_UNAUTHORIZED,
        detail="Could not validate credentials",
    )
    payload = decode_jwt(token)
    if payload is None:
        raise credentials_exception
    user = await db.get(User, payload["sub"])
    if user is None:
        raise credentials_exception
    return user

7. Python CI/CD 自动化(GitHub Actions)

将 Codex CLI 集成到 GitHub Actions 流水线,可以在 CI 失败时自动分析问题、在代码审查阶段自动生成改进建议。

# .github/workflows/python-ci.yml
name: Python CI

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ["3.11", "3.12"]

    services:
      postgres:
        image: postgres:15
        env:
          POSTGRES_PASSWORD: postgres
        options: >-
          --health-cmd pg_isready
          --health-interval 10s

    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install Poetry
        run: pip install poetry

      - name: Install dependencies
        run: poetry install --with dev

      - name: Lint (ruff + mypy)
        run: |
          poetry run ruff check app/
          poetry run mypy app/ --strict

      - name: Test with coverage
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          DATABASE_URL: postgresql://postgres:postgres@localhost/testdb
        run: |
          poetry run pytest --cov=app --cov-report=xml --cov-fail-under=80

      - name: AI Test Generation (on failure)
        if: failure()
        run: |
          pip install @openai/codex
          codex exec "Analyze failing tests and suggest fixes without modifying production code"
延伸阅读:完整的 CI/CD 配置参考:Codex CLI CI/CD 集成指南,包括多阶段流水线、Secret 管理、矩阵测试和自动发布等高级配置。

8. 常用 Python 提示词速查

以下是 Python 开发中高频使用的 Codex 提示词模板,可直接复制并按需修改:

场景 提示词模板 说明
生成 dataclass "为 UserProfile 创建 Python dataclass,包含 field validators 和 __post_init__" 自动添加验证逻辑
重构异常处理 "把 bare except 和 Exception catch 改为具体的异常类型,添加有意义的错误信息" 提高可调试性
异步化同步代码 "把 user_service.py 中的同步函数改为 async/await,用 asyncio.gather 并行化独立调用" 性能优化
生成 Alembic 迁移 "分析 models.py 相对上一版的变化,生成对应的 Alembic 迁移脚本(含 downgrade)" 数据库迁移
优化慢查询 "分析 Django Debug Toolbar 输出的慢查询,给出 ORM 优化建议" 性能调优
生成 Makefile "为 Python 项目生成 Makefile,包含 install/test/lint/format/clean/docker-build 目标" 开发便利性
生成 conftest.py "创建 pytest conftest.py,包含 async db fixture、用户 fixture 和 API client fixture" 测试基础设施
添加日志 "为 service 层添加结构化日志(structlog),包含请求 ID 追踪和性能计时" 可观测性

9. 常见问题 FAQ

Codex CLI 支持 Python 项目吗?

完全支持。Codex CLI 是语言无关的工具,天然支持 Python 项目。配合合理的 AGENTS.md 配置,可以让 Codex 了解你的 Python 版本、依赖管理工具(pip/poetry/conda)和测试框架,实现更准确的代码生成。

如何让 Codex CLI 生成符合 PEP 8 的 Python 代码?

AGENTS.md 中指定代码风格要求:「所有 Python 代码遵循 PEP 8,使用 Black 格式化,类型注解遵循 mypy strict 模式」。或在提示词中明确要求:「生成的函数需要添加完整的 type hint 和 docstring(Google 风格)」。也可以直接让 Codex 在生成代码后自动运行 blackruff --fix 进行格式化。

Codex CLI 可以在 Python 虚拟环境中使用吗?

可以。在激活虚拟环境(venv/conda/poetry shell)后运行 codex 即可。Codex 会继承当前 shell 的环境,可以执行 pip installpytestmypy 等命令。建议在 AGENTS.mdallowed_commands 中列出允许的命令,避免 Codex 意外安装不受信任的包。

Codex CLI 可以帮助 Django 项目生成代码吗?

可以。Codex 可以生成 Django 的 Model、View、Serializer、URL 配置、Migration、管理命令等。在 AGENTS.md 中说明 Django 版本和项目结构(如 apps 目录布局),Codex 会遵循 Django 的约定和最佳实践,生成符合 Django 风格的代码。

其他语言指南: ⚡ JavaScript/TypeScript 指南 · 🐹 Go 开发指南 · ♻️ 代码重构指南
← 提示词示例大全 实用技巧 →