编译强档

把应用编译成原生二进制,授权闸门自动插入每一个模块——不出货明文 Python,也没有单独一处检查可以被找到删掉。

便捷档出货的是解密一次即可读的 Python 字节码。magiclock build 更进一步:自动给源码树里每一个模块插入一次授权闸门检查,把这个闸门直接编织进编译后的原生代码,加密你打包进去的模型,内嵌厂商公钥,然后编译——这样没有明文 Python 可读,也没有单独一处检查可以被找到并 patch 掉。

不需要标记任何东西

没有装饰器,也不需要给代码加任何注解——你的源码完全不用改。magiclock build app.py 会遍历从 app.py 能到达的每一个 .py 模块,在编译前给每个模块插入一次闸门检查(核对 python_protect 这项能力)。入口模块还会自动插入一次 magiclock.air.bootstrap() 调用,不需要你自己写:

python
# 你的源码,原封不动——不需要装饰器,也不需要手动加 bootstrap() 调用
def export_report(data: str) -> bytes:
    return render_pdf(data)
shell
magiclock build app.py   # 树里的每一个模块——包括这个——都会被自动加上闸门

闸门检查每个模块只跑一次,在进程第一次 import 它的时候执行——这是"每模块一个检查点",不是"每次调用一个检查点"(长时间运行的进程下这意味着什么、以及有效期/吊销的权衡,见安全模型)。

编译

shell
magiclock build app.py                        # -> dist/app.<...>.so   (单个编译模块)
magiclock build app.py --standalone            # 改为生成一个自包含的应用目录
magiclock build app.py --no-compile            # 只扫描 + 注入 + 内嵌——跳过编译(不需要 C 工具链)
magiclock build app.py --model weights.onnx    # 同时把一个模型加密打进构建产物(可重复)
参数默认值含义
-o, --output-dirdist构建产物的输出目录。
--source-root入口文件所在目录要扫描/转换的项目根目录(当 app.py 不在项目顶层时使用)。
--module编译成单文件原生扩展(默认目标)。
--standalone改为编译成自包含的应用目录,与 --module 互斥。
--no-compile关闭只做扫描、注入闸门、内嵌资源,跳过真正的原生编译——适合检查转换结果,或构建机没有 C 工具链时使用。
--keep-tmp关闭保留中间转换目录,不清理。
--model PATH加密一个模型并打进构建产物,可重复使用。
--model-lock-passphrase关闭给打包进去的模型加一个口令作为第二因子(至少需要一个 --model)。
--model-trial / --model-expires-in / --model-expires-at打包模型的有效期——语义与加密你的代码的有效期参数相同,彼此互斥。

你的用户拿到什么

编译出的 .so/.pyd/独立目录在运行它的机器上不需要安装 MagicLock、不需要账号、不需要联网——解密与授权检查都完全离线(见安全模型)。

默认情况下编译产物是机器锁定的:只能在构建它的那台机器上解密运行(信任根是那台机器的指纹)。如果你需要同一份构建在多台机器上运行——第二台工作机、一台部署服务器——把那台机器也纳入你的账号并在那台机器上构建;编译强档目前还没有提供加密你的代码加密模型那种便携(--no-bind-machine)解锁方式。

接下来看什么

  • 安全模型——为什么编译强档能挡住便捷档挡不住的"直接找到并 patch 掉检查"绕过方式。
  • 账号与激活——激活更多构建/部署机器。