Codex 这个命令行工具在 Windows 上装起来,说难不难,说简单也真能让人卡上一整天。我前后在三台机器上折腾过:一台是家用笔记本的原生 PowerShell,一台是公司配的开发本,靠 WSL 跑,还有一台是临时用的虚拟机。三次遇到的问题各不相同,但归结起来无非几类:装不上、找不到命令、认证过不去、沙箱起不来。这篇 Codex Windows 避坑指南就按这条真实链路走一遍,从安装环境的前置检查,到沙箱报错的逐条拆解,把我踩过的坑和验证过的处理方式都摊开讲。如果你刚在 Windows 上接触 Codex,或者已经被某条沙箱报错卡了半天,这篇排查手册可以直接当对照表用;如果你只是想先搞清楚它在本机是怎么跑的,前面两节看完也能少走不少弯路。
1. 先搞清楚 Codex 在 Windows 上到底跑在哪一层
很多人一上来就复制安装命令,报错之后再回头找原因,结果发现自己连“它跑在哪一层”都没弄清楚。Codex 是一个命令行程序,它依赖 Node 运行时,运行时又要去创建子进程执行命令,而沙箱能力恰恰绑定在操作系统层面。Windows 上这三层关系一旦错位,报错就会以各种奇怪的面目出现。所以第一步不是装,而是先确认你打算让它跑在哪种形态里,这决定了后面所有排查的方向。
1.1 三种运行形态的差异与选择依据
在 Windows 上跑 Codex,实际有三种常见形态,它们的沙箱能力、路径语义和权限模型完全不同。
第一种是原生 PowerShell 或 CMD。这是最直觉的方式,装完 Node 直接全局安装,命令就能用。优点是路径就是你熟悉的C:\盘路径,编辑器和终端不用来回切;缺点是沙箱能力受平台限制,某些版本会直接告诉你当前平台不支持沙箱,或者虽然号称支持,但落到子进程创建、文件写入限制上会出现权限被拒。这类报错最难查,因为错误信息往往只有一句Access is denied或者spawn EPERM,看不出到底卡在哪一步。
第二种是Git Bash 这类类 Unix 终端。它提供了 bash 语法和部分 Unix 工具链,看起来更接近文档里的示例。但它本质是 Windows 上的一层兼容环境,TTY 行为、信号处理、路径转换都有差异,交互式界面容易出现字符错乱、方向键失灵,子进程的终端附着也可能出问题。如果你的报错是“界面卡住不动”“输入没反应”,八成和这一层有关。
第三种是WSL。这是我认为在 Windows 上跑 Codex 最省心的形态,没有之一。WSL 里就是一个完整的 Linux 用户空间,沙箱机制、文件权限、进程模型都和文档描述一致,路径是/home/xxx而不是C:\Users\xxx,大部分在原生 Windows 上莫名其妙的报错在这里根本不会出现。代价是你需要跨一层文件系统,项目文件放在 Windows 盘还是 WSL 盘,会直接影响读写速度和权限表现。
我一般这样选:临时试用、只跑只读分析,用原生 PowerShell 图省事;要长期用、要让它改代码、要开沙箱,直接进 WSL。中间那种 Git Bash 的形态,除非你有历史习惯,否则不建议作为主力。
1.2 沙箱机制的平台差异与报错根源
沙箱这个词听起来抽象,落到实处其实就三件事:限制它能读哪些目录、限制它能写哪些目录、限制它能启动哪些子进程。不同平台实现这套限制的技术手段不一样,Linux 上用的是内核提供的访问控制能力,macOS 上有系统自带的沙箱执行器,而 Windows 原生环境在这方面的支持一直是个短板。
短板的直接后果就是:当 Codex 尝试初始化沙箱时,发现自己拿不到对应的系统能力,于是要么降级、要么报错退出。你看到的报错文本可能是“当前平台不支持该沙箱模式”,也可能是更底层的“初始化失败”,还可能是子进程创建被系统拒绝。这三种表现背后其实是同一个根因,但处理方式完全不同:第一种要换运行形态或换模式,第二种要看权限和临时目录,第三种要查安全软件的拦截记录。
这里有个很容易被忽略的点:沙箱模式和审批策略是两套独立的开关。沙箱管的是“它能做什么”,审批管的是“做之前要不要问你”。很多人把这两个概念混在一起,一看到报错就去关审批,结果沙箱该报错还是报错。正确的排查顺序是先用codex --help确认当前版本到底暴露了哪些与沙箱相关的参数,再看配置文件里的默认值,最后才动手改。版本之间的参数名和取值都可能变化,网上抄来的配置不一定适用于你手上的版本。
1.3 三种形态的对比与我的取舍
把关键差异列成表更直观,下面这张表是我自己在选型时用的判断依据,你可以直接对照自己的场景。
| 维度 | 原生 PowerShell | Git Bash 类终端 | WSL |
|---|---|---|---|
| 沙箱可用性 | 受版本和平台限制,常需降级 | 同原生,且多一层兼容问题 | 与文档描述一致,最完整 |
| 路径语义 | Windows 盘符路径 | 混合,易出现路径转换问题 | 纯 Linux 路径 |
| 交互体验 | 良好 | 字符与按键偶发异常 | 良好 |
| 文件读写速度 | 本机盘最快 | 本机盘最快 | WSL 盘快,跨/mnt/c明显变慢 |
| 权限模型 | Windows ACL | Windows ACL | Linux 权限位 |
| 适合场景 | 只读分析、临时试用 | 有 bash 使用习惯者 | 长期使用、需要改代码 |
选型背后的逻辑其实很简单:沙箱能力越完整,你越不需要靠人肉审查去兜底。在原生 Windows 上关掉沙箱,等于让它拥有你当前用户的全部权限,这时候它能做什么完全取决于模型判断,而不是系统约束。短期试用无所谓,长期跑就得掂量。所以我的建议是把 WSL 当主力形态,原生形态只用来做那些明确不需要写文件的活。
2. 安装环节的坑:从 Node 版本到命令找不到
安装阶段的报错有一个共同特点:它们看起来都像“装失败了”,但真正的原因可能藏在版本、权限、路径、终端策略这四个地方。我见过最常见的一幕是,命令敲下去终端刷了一屏红色,最后一行写着权限不足,然后人就开始怀疑是不是要管理员权限,接着用管理员开了一个新窗口重装,问题依旧。这一节按依赖顺序把每一步该验证的东西列清楚。
2.1 Node 与 npm 的前置检查不能省
Codex 依赖 Node 运行时,版本不够会直接导致安装后无法启动,而且报错往往不直观。先跑三条命令把底数摸清:
node -v npm -v where.exe node第一条看运行时版本,第二条看包管理器版本,第三条看实际生效的可执行文件路径。第三条特别关键:如果你机器上装过多个 Node 版本,或者曾经用系统安装包和版本管理工具各装过一次,where.exe会返回多行结果,排在前面的那个才是真正被调用的。我就遇到过node -v显示的是一个较新版本,但实际运行的是另一份旧运行时,原因是环境变量里旧路径排在前面。
版本选择的经验是:跟着官方文档写的最低要求走,不要贴着下限。文档说需要某个大版本以上,你就往上取一个当前维护中的版本。原因不是新版本一定更好,而是下限版本往往缺少某些子进程相关的修复,恰恰是沙箱报错的高发区。切换版本建议用版本管理工具,不要手工改环境变量,手工改迟早会乱。
还有一个隐藏坑:某些版本管理工具在切换版本时,全局安装的包不会跟着迁移。你昨天装好的命令,今天切了个版本就找不到了。这不是装失败,是全局包目录换了。处理办法是切完版本重新装一次,或者把全局包目录固定到一个与版本无关的位置。
2.2 全局安装权限与 npm 前缀设置
全局安装报权限错误,是 Windows 上最高频的安装问题。典型表现是安装过程中出现EACCES或EPERM,提示某个目录操作不被允许。根因通常是把全局目录放在了需要管理员权限的系统路径下。
先看当前全局目录在哪:
npm config get prefix npm config get cache如果前缀指向的是系统盘下的程序目录,普通用户写入就会被拒。两种处理方式:一是每次都用管理员终端安装,我不推荐,因为后续运行和升级也会受同一套权限约束,容易埋雷;二是把全局目录改到当前用户可写的位置,然后把这个位置加进 PATH。后者更干净:
npm config set prefix "$env:APPDATA\npm"设置完之后,把%APPDATA%\npm加入用户级 PATH,重开终端生效。这里要注意顺序:先改前缀,再装包,最后验证 PATH。顺序反了会出现“装成功了但命令找不到”的假象。
另外提醒一句,安装过程如果卡在某个包上很久不动,别急着中断重来。先看是不是当前目录下有残留的锁文件,或者上一次安装留下的半成品目录。清掉缓存再装,比反复重试有效。
2.3 命令找不到的三类原因
装完之后敲命令提示“不是内部或外部命令”,这是另一类高频问题。原因只有三类,逐条排就行。
第一类是 PATH 没生效。改了环境变量但没重开终端,或者改的是系统级变量而当前会话读的是用户级变量。关掉终端重开一次,再跑where.exe看能不能定位到。
第二类是全局包的 bin 目录名不对。不同包管理器生成的命令包装文件后缀不同,有的是.cmd,有的是无后缀的脚本。在 PowerShell 里调用时,如果只认无后缀的那份,可能匹配不到。这种时候用where.exe把实际文件名看清楚,直接调完整文件名验证一次。
第三类是被安全软件隔离了。这种情况最隐蔽,因为安装日志一切正常,就是命令不存在。去安全软件的隔离区看一眼,如果有对应的可执行文件,加白名单后重装。
2.4 安装后的自检清单
装完别急着跑正式任务,先做一轮自检。下面这张表是我每次换机器都会过一遍的清单,五分钟能省掉后面半小时的排查。
| 检查项 | 命令 | 期望结果 |
|---|---|---|
| 运行时版本 | node -v | 不低于文档要求的主版本 |
| 包管理器版本 | npm -v | 与运行时匹配 |
| 命令是否可定位 | where.exe codex | 返回至少一个有效路径 |
| 版本是否可输出 | codex --version | 正常打印版本号 |
| 帮助是否可展开 | codex --help | 列出参数,含沙箱相关项 |
| 全局目录权限 | 在全局目录下新建文件 | 无需提权即可创建 |
| 终端编码 | chcp | 输出 65001 或可切换为 65001 |
注意:自检阶段不要跳步。很多人
codex --version能出结果就直接开始跑任务,结果第一次触发文件写入就报权限错误,回头再查反而更费时间。
3. 认证与配置:别让第一次启动就卡住
装好只是第一步,第一次启动时的认证和配置同样能卡住人。这一块的报错通常比较明确,但容易和沙箱问题混在一起,因为两者都发生在启动瞬间。我的做法是把认证和沙箱拆成两轮验证:先确保能正常发起一次最简单的只读请求,再去动沙箱相关的配置。这样出问题时能立刻判断是哪一层的锅。
3.1 认证方式的取舍与环境变量
认证一般有两条路:交互式登录和用环境变量注入凭据。交互式登录适合个人机器,浏览器走一遍流程就完事,凭据落在用户目录下,后续启动不用重复操作。环境变量适合脚本化、容器化或者多人共用的构建机,好处是不依赖浏览器,坏处是凭据容易泄漏到日志里。
用环境变量时,注意两点。第一,不要把它写进项目目录里的任何文件,包括示例配置和脚本注释,一旦提交出去就是事故。第二,在 PowerShell 里设置时区分当前会话和持久化:
# 仅当前会话有效,关窗口即失效 $env:CODEX_API_KEY = "你的凭据" # 写入用户级环境变量,需重开终端 [Environment]::SetEnvironmentVariable("CODEX_API_KEY", "你的凭据", "User")第二种方式方便但风险高,机器多人共用时不建议。我自己的习惯是只在当前会话设置,需要长期用就写一个启动脚本,脚本本身放在版本控制之外。
还有一种情况是凭据存在但认证仍失败。先确认环境变量名有没有拼错,再看是不是旧的会话缓存了另一套凭据。把配置目录下的认证缓存清掉重新登录,通常能解决。清理之前记得备份,别把其他配置一起删了。
3.2 配置文件的最小可用写法
Codex 的配置一般放在用户目录下的配置文件夹里,文件名是config.toml。第一次用不要抄网上那种几十行的复杂配置,先用最小配置跑通,再按需加。下面这份是我验证过的最小骨架,字段含义写在注释里:
# 模型标识按官方文档填写,不同版本可选项不同 model = "按官方文档填写" # 审批策略:决定执行动作前是否询问 # 可选值按版本而定,常见有 untrusted / on-request / never approval_policy = "on-request" # 沙箱模式:read-only 只读、workspace-write 可写工作区、danger-full-access 全权限 sandbox_mode = "workspace-write" # 工作区可写的额外目录,按需添加 [sandbox_workspace_write] writable_roots = []这里要强调一个原则:先只读,再可写,最后才考虑全权限。只读模式能验证认证、模型调用、上下文加载是否正常,排除了写权限带来的干扰。等只读跑通,再切到工作区可写,观察它是否只在预期目录内落文件。全权限模式我一般只在一次性虚拟机里用。
配置改完不需要什么编译步骤,下次启动自动读取。但如果你在同一个终端里连续调试,注意有些参数是启动时读取一次的,改完要重开进程才生效。
3.3 项目说明文件与工作目录约定
有个容易被低估的东西:项目根目录下的说明文件。它的作用是告诉模型这个项目的结构、约定、哪些目录不要碰。写得好能显著减少它乱翻文件的行为,写不好等于给它挖坑。
我的写法是三条:一句话说明项目干什么,列出关键目录及用途,明确列出禁改区域。比如构建产物目录、依赖目录、凭据目录,都要写清楚不要动。别指望它自己判断哪些是生成物,明确写出来成本最低。
工作目录的约定同样重要。不要在用户主目录直接启动,那样它的工作区范围会覆盖整个用户目录,一旦进入可写模式,影响面太大。正确做法是每次进到具体项目目录再启动,让工作区自然收敛到当前项目。这一点在原生 Windows 上尤其要注意,因为路径分隔符和盘符的存在,让“当前目录”的边界感更弱。
4. 沙箱报错逐条拆解
终于到正题。沙箱报错之所以让人头疼,是因为同一个根因在不同版本、不同终端下会呈现完全不同的文本。下面我按“报错现象、可能原因、验证方式、处理方案”四段式逐条拆,你可以直接拿报错关键词去对照。
4.1 常见报错原文对照表
先把高频报错和对应方向列出来,方便快速定位。
| 报错关键词 | 大概率原因 | 优先验证 |
|---|---|---|
| 当前平台不支持该沙箱模式 | 原生 Windows 缺少对应系统能力 | 换 WSL,或显式改用其他模式 |
| 沙箱初始化失败 | 临时目录不可写、权限不足 | 检查临时目录权限与磁盘空间 |
| 子进程创建被拒绝(spawn 类错误) | 安全软件拦截、可执行文件路径异常 | 查拦截记录,用完整路径调用 |
| 访问被拒绝(Access denied) | 目标目录 ACL 不允许写入 | 换工作目录,避开同步盘与系统盘 |
| 找不到路径(ENOENT) | 路径含空格、中文或超长 | 移到短英文路径重试 |
| 参数无效(EINVAL) | 调用方式与平台不匹配 | 检查是否需要经 shell 转发 |
| 审批等待超时 | 交互式提问未被响应 | 检查终端是否为真交互终端 |
这张表不是穷举,但覆盖了我实际遇到过的大部分情况。看表的时候注意一点:同一个报错可能有多因。比如“访问被拒绝”既可能是沙箱限制,也可能是文件系统 ACL,还可能是安全软件。所以要结合验证方式一步步排除,不要看到关键词就直接套方案。
4.2 原生 Windows 沙箱不可用的处理路径
这是最典型的一类。现象是启动时直接退出,提示当前平台不支持所选沙箱模式,或者在执行第一个需要隔离的动作时报错。根因前面说过,原生 Windows 缺少对应的系统级隔离能力,工具在这层拿不到它需要的东西。
处理路径有三条,按推荐度排序。
第一条,换到 WSL 里跑。这是最彻底的办法,沙箱能力和文档描述一致,后续不会再为平台差异买单。迁移成本主要是项目文件位置,建议把项目放在 WSL 自己的文件系统里,比如用户主目录下的项目文件夹,而不是放在 Windows 盘再通过挂载点访问。后者能用,但读写速度和权限表现都差一截。
第二条,升级到明确支持原生 Windows 沙箱的版本。版本差异这块变化很快,我不建议凭记忆判断,直接跑codex --help看参数列表里有没有沙箱相关的选项,再看官方文档对应版本的平台说明。如果帮助里根本没有沙箱参数,那就说明这个版本在原生环境下不提供该能力,别硬试。
第三条,显式改用不需要沙箱的模式,同时把审批策略调严。这是妥协方案,适合临时验证。原则是:关掉沙箱的同时必须打开审批,让每一个有副作用的动作都经过你确认。绝对不要出现“既关沙箱又关审批”的组合,那等于把整台机器交给它。
4.3 WSL 下的沙箱与路径映射细节
进了 WSL 不代表万事大吉,路径这关还会绊人。WSL 访问 Windows 盘是通过挂载点,比如/mnt/c/...。这个路径下运行 Codex,会遇到两个问题。
第一是权限表现异常。挂载点上的文件权限是模拟出来的,往往表现为所有文件权限位都很宽,沙箱在判断“这个文件是否可写”时容易得出与你预期不符的结论。表现就是明明那个文件在 Windows 里是只读的,它却认为可写,或者反过来。
第二是读写性能明显下降。跨文件系统访问有额外开销,项目文件一多,启动时的文件扫描就会拖慢,严重的时候会让你误以为是卡死。
我的处理方式很直接:项目放在 WSL 自己的文件系统里,需要和 Windows 侧交换文件时用共享目录,只放必要的输入输出。这样沙箱的权限判断符合 Linux 语义,性能也正常。如果你确实需要在/mnt/c下工作,至少把工作区可写范围收窄到具体子目录,不要让整个挂载点都进范围。
还有个小细节:换行符。Windows 侧编辑的文件带的是回车换行,进到 WSL 里某些脚本会因此报“解释器找不到”这种莫名其妙的错误。统一转成 Unix 换行,或者在 git 配置里固定换行处理策略,能省掉一类问题。
4.4 关闭沙箱的正确姿势与风险边界
有时候你就是要关沙箱,比如在一次性虚拟机里做批量处理,或者排查问题需要排除沙箱变量。关可以,但要关得有边界。
推荐组合是:沙箱模式设为全权限,审批策略设为按需询问。这样它有完整能力,但每次要执行命令前会先问你。命令行上大致是这样:
codex --sandbox danger-full-access --ask-for-approval on-request另一条路是完全绕过,参数名里通常带“危险”字样,顾名思义。这个我只在两种场景下用:一次性的隔离环境,以及明确知道所有输入都可信的批处理。在任何存有凭据、私有代码、生产配置的机器上,都不要用这个参数。不是说它一定会出事,而是出事之后你没有第二道防线。
还有一个常被忽略的风险点:即使开着沙箱,工作区可写模式下它能改的也是整个工作区。如果工作区里有构建脚本、依赖清单、持续集成配置,它一样能改。所以真正的边界不是沙箱模式,而是工作区里放了什么。我现在的习惯是把敏感配置全部移出项目目录,用环境变量或外部配置注入,让工作区里没有值得被改的东西。
5. 实操演练:一次完整的从零到跑通
前面讲的是拆解,这一节把流程串起来,给你一份可以照着走的操作记录。我用一台干净的 Windows 机器做演示,目标是在 WSL 里跑通一次只读分析,再切到工作区可写验证一次文件落盘。
5.1 环境准备与前置脚本
先确认 WSL 状态。用管理员权限打开终端,执行:
wsl --status wsl --list --verbose第一条看默认版本和内核状态,第二条列出已安装的发行版及版本号。如果列表为空,说明还没装;如果版本号是 1,建议升级到 2,沙箱相关的系统能力在 2 上完整得多。升级命令按官方文档给的来,不同系统版本命令略有差异,别照抄旧教程。
进到 WSL 之后,先做运行时检查:
node -v npm -v which node df -h ~最后一条是看磁盘空间,这条很多人不做,结果装到一半空间不足,报错文本还完全看不出是空间问题。我第一次就栽在这,排查了半小时才发现根目录只剩几百兆。
5.2 分步执行与现场记录
第一步,全局安装。装完立刻验证命令可定位:
npm install -g <按官方文档给出的包名> which codex codex --version第二步,建一个最小项目目录,只放一个说明文件和一个待分析的源文件:
mkdir -p ~/projects/demo && cd ~/projects/demo printf '# Demo\n\n只读分析用。\n' > AGENTS.md说明文件里写清楚“不要修改任何文件”,这是给模型的第一道提示。
第三步,用只读模式启动,发一个简单请求,确认认证和模型调用都正常:
codex --sandbox read-only如果这一步能正常返回,说明安装、认证、配置三层都通了。此时不要急着切模式,先在只读模式下多问几个问题,观察它是否会尝试写文件、是否会在工作区外读取。只读模式下的任何写入尝试都应该被拦下来,如果没被拦,说明沙箱没生效,得回头看 4.2 节。
第四步,切到工作区可写,验证落盘范围:
codex --sandbox workspace-write让它创建一个测试文件,然后检查文件是否只出现在当前目录:
ls -la find ~ -newer AGENTS.md -type f 2>/dev/null | head -20第二条命令是看最近被修改的文件有没有跑到工作区外面去。这一步是我必做的,因为工作区边界设置不当的时候,它确实可能写到相邻目录。
5.3 关键参数与超时设置的经验值
参数这块没有万能值,但有取舍逻辑。下面几个是我调过的,附上我的取值理由。
| 参数 | 作用 | 我的取值 | 理由 |
|---|---|---|---|
| 沙箱模式 | 控制读写范围 | 先只读后工作区可写 | 分阶段验证,降低排查难度 |
| 审批策略 | 控制询问频率 | 按需询问 | 有副作用时人工确认,纯读取不打扰 |
| 单次执行超时 | 防止长时间挂起 | 按任务复杂度分档 | 简单分析短超时,批量处理长超时 |
| 工作区可写目录 | 收窄写入范围 | 只列必要子目录 | 减少误改面 |
| 上下文预算 | 控制单次输入量 | 按项目规模估 | 超预算会截断,影响判断质量 |
超时这块多说一句。设太短,任务还没跑完就被中断,你会以为是程序问题;设太长,真卡住的时候你要干等。我的做法是先用一个明显偏短的超时跑一次,看它在哪一步停住,再按实际耗时往上加一档。上下文预算同理,先用小预算确认流程通,再逐步放大。这种“先小后大”的调法比一次设到位省时间,因为你永远不知道瓶颈在哪。
6. 常见问题速查与避坑心得
这一节把我这些年攒下来的零散经验集中放一下,都是文档里不会写、但实际会撞上的东西。
6.1 高频问题速查表
| 现象 | 排查顺序 | 处理要点 |
|---|---|---|
| 安装报权限错误 | 全局目录位置 → 目录 ACL → 安全软件 | 全局目录移到用户可写位置 |
| 装完命令找不到 | PATH 是否生效 → 实际文件名 → 隔离区 | 重开终端,必要时调完整路径 |
| 启动即退出 | 运行时版本 → 配置语法 → 认证 | 逐项最小化验证 |
| 沙箱不支持 | 平台 → 版本 → 帮助参数 | 换 WSL 或降级模式 |
| 子进程创建失败 | 安全软件 → 路径是否含空格中文 → 临时目录 | 加白名单,换短路径 |
| 写入被拒 | 沙箱模式 → 目录 ACL → 是否同步盘 | 收窄工作区,避开同步目录 |
| 交互界面异常 | 终端类型 → 编码 → TTY | 换终端,切 UTF-8 |
| 输出乱码 | 代码页 → 终端字体 → 文件编码 | 统一 UTF-8 |
用这张表的时候有个技巧:从最靠前的一列开始排除,不要跳。因为很多后面的现象是前面原因导致的连锁反应,跳着查容易误判。
6.2 编码、换行与路径的三重坑
这三个东西单独看都不难,凑在一起就是灾难。中文路径会导致某些子进程创建失败,因为参数传递过程中的编码转换出了问题;换行符混用会让脚本解释器找不到入口;代码页不对会让输出全是方块,你连报错都读不懂。
我的固定做法是三条:项目路径只用英文和短横线,长度控制在合理范围;终端统一切到 UTF-8 代码页;跨系统交换的文件在提交前统一换行符。这三条听起来像常识,但每一条我都是被坑过之后才养成习惯的。
路径长度这条要单独提。Windows 有历史遗留的路径长度限制,虽然新版本系统可以开启长路径支持,但很多工具链并没有完全适配。项目层级一深,加上依赖目录的长文件名,很容易越线,报错还往往是“找不到文件”这种误导性文本。把项目放在层级浅的位置,能规避一大类问题。
6.3 我踩过的几个坑
第一个坑是在同步盘里跑。当时图方便,项目放在自动同步的目录下,结果它每写一个文件,同步进程就去抢一次句柄,表现是随机出现写入失败,报错每次都不一样。查了很久才反应过来是同步冲突。后来所有项目一律移出同步目录,问题消失。
第二个坑是用管理员终端跑日常任务。一开始是为了省事,反正权限大不会报错。结果生成的临时文件和缓存全都是高权限,后来换普通用户跑就各种读不了。现在的原则是:安装阶段可以用提权终端,日常运行一律普通权限,保持文件归属一致。
第三个坑是相信了过期的教程参数。网上很多配置示例用的是旧版本的字段名,照着写进去不报错,但也不生效,你会以为功能坏了。判断方法很简单:改完配置后用一个能明显体现差异的场景验证一次,比如把沙箱从只读改成可写,看它是不是真的能写文件了。不验证就等于没改。
第四个坑是忽略审批策略的交互前提。审批是按需询问,前提是终端能正常接收输入。如果你在某种非交互环境里跑,审批请求发不出来,表现就是一直挂着。这种时候要么换成真交互终端,要么把审批策略调成不需要询问,但后者要配合更严格的沙箱,别两个都放开。
第五个坑是把工作区设得太大。有次直接在用户主目录启动,工作区覆盖了整个用户目录,它扫描文件时把一些无关的大目录也读进去了,响应慢得离谱,还差点改到不该改的东西。现在启动前一定先pwd看一眼当前目录,确认是项目根再继续。
这几个坑的共同点是:它们都不在报错信息里。你得靠对环境的理解去预判,而不是靠报错去反推。所以我现在换新机器,第一件事不是装工具,而是把目录结构、权限归属、终端编码这些基础项先理顺,后面能省掉一大半排查时间。
我个人在实际操作中的体会是,Windows 上跑 Codex 的绝大部分麻烦,本质上都不是工具本身的问题,而是平台差异带来的环境错配。把运行形态选对、把路径和权限理顺、把沙箱和审批这两个开关分清楚,剩下的基本就是照着报错对照表走流程。真遇到查不动的,先别改配置,退回到最小可复现状态:一个空目录、一个说明文件、只读模式,跑通了再一层层加回来。这个笨办法我用了很多次,每次都比瞎试快。