编译强档
把应用编译成原生二进制,授权闸门自动插入每一个模块——不出货明文 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-dir | dist | 构建产物的输出目录。 |
--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)解锁方式。