1. 引言:Codex 到底是什么

很多朋友开通 ChatGPT Plus 或 Pro 之后,第一反应是去聊天窗口里问问题、写文案、翻译文档。但如果你是一名开发者,或者正在学习编程,那么有一个功能你绝对不能错过——那就是 Codex。

Codex 是 OpenAI 推出的 AI 编程智能体(Agent),它不是一个简单的代码补全工具,而是一个能够独立理解需求、规划任务、编写代码、运行调试、甚至提交 Git 的自动化编程助手。简单来说,你给它一个任务,它能像一名初级工程师一样,自己打开终端、创建文件、安装依赖、运行测试,然后告诉你结果。

本文将从零开始,带你了解开通 ChatGPT Plus/Pro 后如何快速上手 Codex,并通过一个真实的小项目,把整个开发流程完整走一遍。全程有代码、有实例、有踩坑记录,建议收藏后跟着操作。

2. 开通后第一步:找到 Codex 入口

2.1 网页端入口

登录 ChatGPT 网页版后,在左侧边栏可以看到一个名为 Codex 的入口(通常带有一个终端图标)。点击进入后,你会看到一个类似聊天窗口的界面,但底部输入框旁边多了一个「运行」按钮。

2.2 桌面应用入口

如果你安装了 ChatGPT 桌面客户端(Windows / macOS),同样可以在侧边栏找到 Codex。桌面端的优势在于,Codex 可以直接操作你本地的文件系统,读写项目文件。

2.3 云端沙箱与本地环境

Codex 提供两种运行环境:

  • 云端沙箱(Cloud Sandbox):OpenAI 为你分配一台远程 Linux 虚拟机,Codex 在其中自由操作,适合快速验证想法,不污染本地环境。
  • 本地环境(Local):Codex 通过命令行工具连接到你自己的电脑,直接在你的项目目录里干活,适合真实项目开发。

建议:刚开始学习时先用云端沙箱,熟悉操作后再切换到本地环境。

3. 第一次对话:让 Codex 帮你写一个 Python 脚本

3.1 明确需求

进入 Codex 界面后,直接在输入框里用自然语言描述你的需求。注意,需求描述越具体,Codex 的产出质量越高。

例如,我们让它写一个批量重命名文件的脚本:

请帮我写一个 Python 脚本,功能是批量重命名指定文件夹下的所有 .jpg 文件,新文件名格式为 photo_001.jpg、photo_002.jpg 这样的递增编号。要求支持命令行参数传入文件夹路径,并打印重命名前后的对照表。

3.2 观察 Codex 的执行过程

提交需求后,你会看到 Codex 开始「思考」并逐步执行:

  1. 它会在沙箱中创建一个工作目录;
  2. 自动生成 rename_files.py 文件;
  3. 写入代码;
  4. 创建测试图片文件并运行脚本验证;
  5. 最后向你汇报结果。

整个过程就像在看一个远程同事干活,非常直观。

3.3 查看生成的代码

Codex 生成的代码大致如下:

import os
import sys
from pathlib import Path

def batch_rename(folder: str) -> None:
    """批量重命名文件夹下的 .jpg 文件为递增编号。"""
    folder_path = Path(folder)
    if not folder_path.exists():
        print(f"错误:文件夹不存在 - {folder}")
        sys.exit(1)

    jpg_files = sorted(folder_path.glob("*.jpg"))
    if not jpg_files:
        print("提示:该文件夹下没有 .jpg 文件。")
        return

    print("重命名对照表:")
    for index, old_path in enumerate(jpg_files, start=1):
        new_name = f"photo_{index:03d}.jpg"
        new_path = old_path.with_name(new_name)
        old_path.rename(new_path)
        print(f"  {old_path.name}  ->  {new_name}")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("用法:python rename_files.py <文件夹路径>")
        sys.exit(1)
    batch_rename(sys.argv[1])

3.4 运行验证

Codex 会自动运行脚本并展示输出结果,你不需要手动复制代码到本地执行。如果脚本报错,它会自己读取错误信息、修复代码、重新运行,直到通过为止。

4. 实战项目:用 Codex 从零搭建一个待办事项 Web 应用

光写小脚本不过瘾,我们来做一个完整的 Web 应用。这个项目会用到 Flask(Python 轻量级 Web 框架)、SQLite 数据库和简单的 HTML 前端,非常适合作为 Codex 的入门实战。

4.1 向 Codex 描述项目需求

请帮我用 Flask 搭建一个待办事项(Todo List)Web 应用,要求:
1. 支持添加、删除、标记完成/未完成待办事项;
2. 数据持久化到 SQLite 数据库;
3. 页面使用简洁的 Bootstrap 风格样式;
4. 提供清晰的代码结构,包含 app.py、templates/index.html、requirements.txt;
5. 最后启动服务并验证功能可用。

4.2 Codex 的规划与执行

Codex 收到任务后,会先列出执行计划:

计划:
1. 创建项目目录 todo-app;
2. 初始化 requirements.txt 并安装 Flask;
3. 编写 app.py 实现后端 API 与页面渲染;
4. 编写 templates/index.html 前端页面;
5. 启动 Flask 服务,用 curl 测试接口;
6. 修复发现的问题并汇报。

然后它就开始逐项执行。你可以在界面上实时看到它敲入的命令和输出。

4.3 核心代码展示

app.py:

from flask import Flask, render_template, request, redirect, url_for
import sqlite3
from datetime import datetime

app = Flask(__name__)
DB_PATH = "todo.db"

def init_db():
    """初始化数据库表。"""
    with sqlite3.connect(DB_PATH) as conn:
        conn.execute("""
            CREATE TABLE IF NOT EXISTS todos (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                title TEXT NOT NULL,
                completed INTEGER DEFAULT 0,
                created_at TEXT NOT NULL
            )
        """)

@app.route("/")
def index():
    """首页:展示所有待办事项。"""
    with sqlite3.connect(DB_PATH) as conn:
        todos = conn.execute(
            "SELECT * FROM todos ORDER BY completed ASC, id DESC"
        ).fetchall()
    return render_template("index.html", todos=todos)

@app.route("/add", methods=["POST"])
def add_todo():
    """新增待办事项。"""
    title = request.form.get("title", "").strip()
    if title:
        with sqlite3.connect(DB_PATH) as conn:
            conn.execute(
                "INSERT INTO todos (title, completed, created_at) VALUES (?, ?, ?)",
                (title, 0, datetime.now().strftime("%Y-%m-%d %H:%M:%S")),
            )
    return redirect(url_for("index"))

@app.route("/toggle/<int:todo_id>")
def toggle_todo(todo_id):
    """切换完成状态。"""
    with sqlite3.connect(DB_PATH) as conn:
        conn.execute(
            "UPDATE todos SET completed = 1 - completed WHERE id = ?",
            (todo_id,),
        )
    return redirect(url_for("index"))

@app.route("/delete/<int:todo_id>")
def delete_todo(todo_id):
    """删除待办事项。"""
    with sqlite3.connect(DB_PATH) as conn:
        conn.execute("DELETE FROM todos WHERE id = ?", (todo_id,))
    return redirect(url_for("index"))

if __name__ == "__main__":
    init_db()
    app.run(host="0.0.0.0", port=5000, debug=True)

templates/index.html:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>我的待办事项</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="bg-light">
    <div class="container py-5" style="max-width: 640px;">
        <h1 class="text-center mb-4">📝 我的待办事项</h1>

        <form action="/add" method="post" class="d-flex gap-2 mb-4">
            <input type="text" name="title" class="form-control" placeholder="输入新的待办事项..." required>
            <button type="submit" class="btn btn-primary">添加</button>
        </form>

        <ul class="list-group">
            {% for todo in todos %}
            <li class="list-group-item d-flex justify-content-between align-items-center">
                <div>
                    <a href="/toggle/{{ todo[0] }}" class="text-decoration-none {% if todo[2] %}text-decoration-line-through text-muted{% endif %}">
                        {{ todo[1] }}
                    </a>
                    <small class="d-block text-muted">{{ todo[3] }}</small>
                </div>
                <a href="/delete/{{ todo[0] }}" class="btn btn-sm btn-outline-danger">删除</a>
            </li>
            {% endfor %}
        </ul>
    </div>
</body>
</html>

requirements.txt:

flask==3.0.0

4.4 验证与交付

Codex 启动服务后,会用 curl 命令模拟请求,验证页面能正常返回、添加和删除功能正常。最终它会告诉你:

✅ 服务已启动:http://localhost:5000
✅ 添加功能测试通过
✅ 删除功能测试通过
✅ 数据库持久化验证通过

5. 进阶玩法:让 Codex 帮你调试和重构

Codex 不只是「写代码」的工具,它更擅长「改代码」。以下是几个高频场景:

5.1 报错修复

把报错信息直接粘贴给 Codex:

运行下面这段代码时报了 TypeError: unsupported operand type(s) for +: 'int' and 'str',请帮我修复:

def calc(a, b):
    return a + b

print(calc(1, "2"))

Codex 会定位问题、解释原因并给出修复后的代码。

5.2 代码重构

请把下面这段面条式代码重构为使用函数和类型注解的清晰版本,并补充 docstring。

5.3 添加单元测试

请为 todo-app 项目编写 pytest 单元测试,覆盖添加、删除、切换状态三个核心接口,并运行测试确认全部通过。

6. 实用技巧与避坑指南

6.1 需求描述要具体

❌ 差:「帮我写个爬虫」

✅ 好:「帮我写一个 Python 爬虫,抓取某网站首页的新闻标题和链接,输出为 CSV 文件,要求使用 requests + BeautifulSoup,并处理请求超时异常。」

6.2 善用「继续」和「修正」

Codex 第一次给出的结果不满意时,不要重新开对话,直接在原对话里补充:

功能没问题,但我想把界面改成暗色主题,并且把数据库换成 PostgreSQL。

6.3 注意安全边界

  • 不要在生产环境直接让 Codex 操作数据库或执行删除操作,先让它输出命令,你确认后再执行;
  • 涉及 API 密钥、密码等敏感信息时,不要让 Codex 写入代码并提交到 Git;
  • 本地模式下,Codex 拥有你电脑的文件读写权限,建议在独立项目目录中使用。

6.4 结合 Git 使用

让 Codex 帮你管理版本:

请把当前项目初始化 Git 仓库,创建 .gitignore 忽略 __pycache__ 和 *.db 文件,然后提交初始版本。

7. 总结:从「会用」到「用好」

开通 ChatGPT Plus/Pro 只是第一步,真正拉开差距的是你如何使用 Codex。回顾本文,我们完成了从「写一个脚本」到「搭建一个完整 Web 应用」的进阶,还掌握了调试、重构、测试等实战技巧。

最后给你三条建议:

  1. 从小任务开始:先让 Codex 写脚本、改 bug,熟悉它的工作方式;
  2. 把它当同事:需求讲清楚、反馈给到位,它就能帮你扛下大量重复劳动;
  3. 保持代码审美:Codex 生成代码后,自己读一遍、改一改,能力才会真正长在自己身上。

现在,打开你的 Codex,给它派第一个任务吧。

Logo

AtomGit AI 社区提供模型库、数据集、Agent、Token等资源

更多推荐