DeepSeek总结的使用 Claude 安全修复 PyPy3.11 测试失败问题
原文地址https://pypy.org/posts/2026/03/using-claude-to-fix-pypy311-test-failures-securely.html使用 Claude 安全修复 PyPy3.11 测试失败问题作者mattip日期2026-03-23 10:27评论0作为 Anthropic 向开源软件贡献者提供的推广活动的一部分我获得了 Claude Max 的 6 个月使用权限。我在开源社区的主要贡献是担任 NumPy 的维护者但我决定试试 claude-code 能为 PyPy 失败的 3.11 测试做些什么。这些失败大多是边缘情况与 CPython 不同的错误消息或在某些情况下失败的调试工具。我有点担心让一个 AI 代理在我的开发机上自由活动。我注意到 Patrick McCanna感谢 Patrick的一篇文章提到使用 bubblewrap 来沙箱化代理。于是我进行了设置并希望是安全地将 claude-code 指向了一些测试。设置有几个步骤需要确保以避免明显的陷阱。有些故事提到代理会清空数据库或删除邮件。Bubblewrap首先我需要了解 bubblewrap 的作用。我按照博客文章中的说明进行了设置并做了一些小的改动sudoaptinstallbubblewrap我最初无法运行bwrap。经过一番探索我发现需要在 Ubuntu 24.04 上为 AppArmor 添加一个例外sudobash-ccat /etc/apparmor.d/bwrap EOF abi abi/4.0, include tunables/global profile bwrap /usr/bin/bwrap flags(unconfined) { userns, } EOFsudoapparmor_parser-r/etc/apparmor.d/bwrap之后bwrap就可以运行了。默认情况下它是完全锁定的所以我开放了一些例外。这些参数是不言自明的。Ubuntu 将可执行文件分散在操作系统的各个位置所以我需要访问多个目录。我需要一个/tmp来运行 pytest。我还希望提示符能反映正在使用 bubblewrap因此修改了主机名catEOL./run_bwrap.shfunction call_bwrap() { bwrap \ --ro-bind /usr /usr \ --ro-bind /etc /etc \ --ro-bind /run /run \ --symlink usr/lib /lib \ --symlink usr/lib64 /lib64 \ --symlink usr/bin /bin \ --proc /proc \ --dev /dev \ --bind $(pwd) $(pwd) \ --chdir $(pwd) \ --unshare-user --unshare-pid --unshare-ipc --unshare-uts --unshare-cgroup \ --die-with-parent \ --hostname bwrap \ --tmpfs /tmp \ /bin/bash $ } EOLsource./run_bwrap.sh call_bwrap# 现在我在一个沙箱化的 bash shell 中# 可以随意尝试看看其他目录尝试 sudo或尝试在沙箱外写入文件exit我没有使用--unshare-network因为我需要使用 claude而这需要网络访问。我确实添加了对$(pwd)的读写访问权限因为我希望它能够编辑当前目录中的代码这才是重点。基础 Claude在尝试了 bubblewrap 并确信它确实有效之后我安装了 claude codecurl-fsSLhttps://claude.ai/install.sh|bash说真的Anthropic这是安装 claude 的最佳方式吗没有 dpkg 包吗我先不安全地运行了一次 claude 来登录。它打开了一个网页并将登录信息保存到了~/.claude.json文件中的oathAccount字段。然后我将 bash 脚本修改为如下内容以便在 bubblewrap 沙箱内运行 claudecatEOL./run_claude.shclaude-safe() { bwrap \ --ro-bind /usr /usr \ --ro-bind /etc /etc \ --ro-bind /run /run \ --ro-bind $HOME/.local/share/claude $HOME/.local/share/claude \ --symlink usr/lib /lib \ --symlink usr/lib64 /lib64 \ --symlink usr/bin /bin \ --symlink $HOME/.local/share/claude/versions/2.1.81 $HOME/.local/bin/claude \ --proc /proc \ --dev /dev \ --bind $(pwd) $(pwd) \ --bind $HOME/.claude $HOME/.claude \ --bind $HOME/.claude.json $HOME/.claude.json \ --chdir $(pwd) \ --unshare-user --unshare-pid --unshare-ipc --unshare-uts --unshare-cgroup \ --die-with-parent \ --hostname bwrap \ --tmpfs /tmp \ --setenv PATH $HOME/.local/bin:$PATH \ claude $ } EOLsource./run_claude.sh claude-safe现在我可以使用 claude 了。注意它需要一些额外的目录才能运行。这个脚本硬编码了版本号将来可能不适用。我希望它能够访问 GitHub以及我本地的 CPython 代码库以便检查差异。我通过点击 GitHub 网页右上角的头像然后进入“设置” → “开发者设置” → “个人访问令牌” → “细粒度令牌” → “生成新令牌”来创建了一个只读令牌。由于 pypy 属于 pypy 组织我使用了“仓库所有者pypy”“仓库访问权限仅 pypy”和“权限内容”。然后我反复确认令牌权限是只读的。之后我将令牌复制到了 bash 脚本中。我还添加了一个对 CPython 代码库的只读绑定以便告诉 claude code 在哪里可以找到缺失的 PyPy 功能的 CPython 实现。--ro-bind$HOME/oss/cpython$HOME/oss/cpython\--setenvGH_TOKEN哈哈分享我的令牌可不聪明\Claude 的沙箱Claude 自带沙箱功能可以通过/sandbox命令进行配置。我选择了默认设置这可以防止仓库中的恶意代码访问文件系统和网络。我缺少一些软件包来使其正常工作Claude 会一直挂起直到我安装它们我不得不使用kill命令终止它。sudoaptinstallsocatsudonpminstall-ganthropic-ai/sandbox-runtime最后的调整我后来发现的最后一件事需要让 claude 访问一些 grep 和 git 工具。虽然 git 应该被外部锁定使其无法推送到仓库但我希望 claude 能以只读方式查看其他 issue 和 pull request。因此我在仓库内部见下文说明应在哪个目录执行此操作添加了一个本地的.claude/settings.json文件{permissions:{allow:[Bash(sed*),Bash(grep*),Bash(cat*),Bash(find*),Bash(rg*),Bash(python*),Bash(pytest*)]}}然后我通过一个本地不属于仓库的配置让 git 忽略该文件即使在执行git clean时也是如此echo-n.claude~/.config/git/ignore那 git push 呢我不希望 claude 捣乱上游仓库只允许读取访问。但我并没有主动阻止git push。因此我没有使用我实际的 pypy 仓库而是将其克隆到一个单独的目录并且没有添加指向 github.com 的远程仓库。修复测试 - 简单部分一切设置妥当之后希望我没有遗漏什么我开始提问。我采用的方法是将构建机器人产生的完整测试失败信息喂给 claude。因此从 py3.11 的构建机器人摘要开始点击其中一个F链接然后将所有内容复制粘贴到 claude 的提示中。没过多久claude 就为长期存在的 ctype 错误缺少异常找到了解决方案结果证明是由于在已经处理错误的情况下缺少一个错误陷阱导致的。另外还缺少一个CTYPES_MAX_ARGCOUNT检查。起初claude 想要修改 CPython 标准库中的 ctypes 代码所以我必须让它明白不能触碰lib-python中的文件。这些文件是从 CPython 原样复制过来的没有充分的理由不应修改。对于删除 ctype 对象的值时引发TypeError而不是AttributeError的修复可能稍微复杂一些claude 需要创建自己的属性类并在赋值中使用它。对于修复 ctypes 数组正确repr的失败测试则涉及更多工作。Claude 需要弄清楚newmemoryview正在引发异常深入研究 RPython 实现并修复问题然后还要修复一个纯 Python 的__buffer__形状边缘情况错误。还有更多例子但你明白我的意思。通过一点点引导并向 claude 展示 CPython 的实现位置现在有更多的测试通过了。修复测试 - 困难部分PyPy 有一个 HPy 后端。有一些测试失败很容易修复例如句柄未关闭、注解警告。但最大的问题是关于 ffi 函数调用前后的上下文跟踪。在调试模式下会检查 ffi 调用是否使用了正确的 HPy 上下文。事实证明在 RPython 中很难保持对上下文的引用因为上下文 RPython 对象是预构建的。解决方案花费了大量的 token 和翻译周期才弄明白是在 C 层面上分配上下文并编写一个 getter 函数在 RPython 中将其取出。结论我在不到 24 小时前开始了这段旅程此前我曾成功地使用 claude 将一些网站从托管平台上重构出来并使其成为静态页面。我对它的印象深刻以至于尝试在终端中使用它进行编码。Anthropic 给了我慷慨的使用额度这对我很有帮助。Claude 似乎能够理解 PyPy 的各个层次从纯 Python 的标准库到 RPython再到少量的 C 代码。我甚至让它检查了最近发布的 PyPy 7.3.21 中的一个段错误它似乎找到了 JIT 中存在潜在 bug 的大致区域。与任何工具一样使用代理编程必须小心谨慎以确保它不会造成破坏。我希望我已经堵住了最明显的风险点如果你有其他关于在使用此类代理时保护自己的想法我很乐意听听。