加密你的代码
protect 与 run、有效期、更强的二因子锁,以及完全不需要机器锁的便携档。
magiclock protect 把一个 .py 文件变成 .pya——一个加了闸门的加密容器——不需要编译器,也不会把你的源码上传到任何地方。magiclock run 负责运行它。
基本用法
shell
# 首次运行:登录并激活这台机器,然后加密。
# 之后每次加密都是瞬时完成、无需交互。
magiclock protect app.py # -> app.pya
magiclock run app.pya
# 指向一个目录即可递归保护整个项目树
# (.venv/venv/__pycache__/.git/dist/build 会被自动跳过)。
magiclock protect src/.pya 就是普通文件,你可以像现在分发应用一样提交、拷贝或打包它——加密效果随文件一起走。
工作原理
.pya 是一个带版本号的小容器,里面包着一个加密信封。magiclock run app.pya 会把它在内存中解密,为它 import 的所有内容安装一个 import 钩子,然后执行——任何明文都不会被写回磁盘。因为里面的字节码和加密它的 CPython 版本绑定,Python 3.12 加密出的 .pya 不能在 3.13 上加载;升级解释器后重新 protect 一次即可。
删除明文
shell
magiclock protect app.py --remove # 加密后删除 app.py有效期:限时与自毁产物
以下参数把有效期直接戳进加密产物本身——独立于你的授权——过期后该产物拒绝解密:
shell
magiclock protect app.py --expires-in 30d # 30 天后停止解密
magiclock protect app.py --expires-at 2026-12-31 # 到指定日期后停止解密
magiclock protect app.py --trial # 固定 48 小时自毁——用于演示与评估--trial、--expires-in、--expires-at 三者互斥,每个文件只能选一个。
更强:二因子锁(机器 + 口令)
默认情况下产物只需要在对的机器上就能解密。加一个口令作为第二因子:
shell
magiclock protect app.py --lock-passphrase
# 交互式提示输入口令(或非交互读取 $MAGICLOCK_PASSPHRASE)
magiclock run app.pya --passphrase便携档:完全不绑定机器
有时你需要产物能在一台你没有激活过的机器上运行——客户的机器,或者你管不到的机器。便携档去掉机器锁,改用共享密钥解锁——更弱,但可以分发:
shell
# 口令保护,不绑定机器:
magiclock protect app.py --no-bind-machine --passphrase
magiclock run app.pya --passphrase
# 或者分发一个生成好的密钥而不是口令:
magiclock protect app.py --no-bind-machine --emit-key
magiclock run app.pya --key <打印出来的密钥>--lock-passphrase 与便携相关参数(--no-bind-machine、--passphrase、--emit-key)互斥——一个产物要么是机器锁定的(可选加口令作为第二因子),要么是便携的(靠口令/密钥解锁而不是机器身份),二者不能同时选。
在 CI 或脚本化运行中,口令和便携密钥都可以从环境变量读取,而不必交互输入:
shell
export MAGICLOCK_PASSPHRASE=... # 用于 --lock-passphrase 或便携 --passphrase 产物
export MAGICLOCK_DECRYPT_KEY=... # --emit-key 产物中 `run --key` 的替代方式
magiclock run app.pya