六个月前,心脏影像研究项目。专利申请在推进,软件著作权材料交了一半,律师真的会看提交记录的那种。团队需要把算法模块打包成二进制交给外部合作方,源码不可读。Python,当然,现在所有研究项目都是Python。

搜了一圈,PyArmor是标准答案。装完跑测试、过构建流水线、发二进制。顺利了两周,直到合作方的第一个生产环境崩溃日志传回来。我习惯性地贴进Claude Code:

打开网易新闻 查看精彩图片

Traceback (most recent call last):
File "dist/algorithms/preprocess.py", line 23, in
AttributeError: 'I0' object has no attribute 'I2'

Claude的回复很礼貌:"我不知道I0或I2指什么。能分享源码吗?"

那一刻我愣住了。花了两周刻意隐藏的源码,现在成了AI助手向我索要的文件。混淆器横在写代码的助手和调试代码的助手之间,真正受益的只有攻击者。

手动对照原始源码解映射,花了40分钟。Bug很简单:缺了个import。然后我去调研了市面上的工具。PyArmor的保护模型是单向设计,Cython直接编译到机器码,更深。两者都无法在不重建工具的前提下解决。

于是我重建了。一个月的夜晚,用Claude Code本身vibe-coding,核心权衡只有一个:混淆输出对外部保持不透明,只留一份极小的映射文件给我自己可读。这就是2026年4月22日发布的pyobfus 0.4.0。

回溯历史:PyArmor诞生于2013年,Cython更老,Oxyry约2017年出现。它们的设计前提一致:你写代码、混淆、发布,然后你自己读生产日志。

这套逻辑跑了十年。混淆侧的摩擦对攻击者是障碍(好),自己调试时付点人体工学税(可接受,公平交易)。

交易崩盘的年份,是LLM接手调试席位的年份。模型能并排阅读堆栈跟踪和源码(它们擅长这个),但名字必须对齐。跟踪说I0,源码仍是UserService,模型没有锚点。(就是上面那个"礼貌陌生人"问题。)

这曾是免费、隐形的成本。