跳转至

如何用 PyArmor加密Python 脚本?

Pyarmor 是一款功能强大的 Python 脚本加密和混淆工具。它不仅能对代码进行常规混淆(如重命名变量和函数),还能将 Python 字节码加密,在运行时动态解密,从而有效防止反编译(如 uncompyle6 或 decompyle++),保护你的核心知识产权。

以下是针对最新版本 Pyarmor 的快速上手核心教程。


一、 基础安装与准备

Pyarmor 可以在 Windows、macOS 和 Linux 上完美运行。直接通过 pip 即可安装:

# 安装 Pyarmor
pip install pyarmor

# 验证安装是否成功
pyarmor --version

⚠️ 注意:加密后的代码与 Python 的主版本号和次版本号 强绑定。如果你用 Python 3.10 加密,最终用户也必须使用 Python 3.10.x 环境运行,无法在 Python 3.9 或 3.11 上运行。


二、 核心使用指南

1. 加密单个脚本

假设你有一个核心脚本叫 main.py:

pyarmor gen main.py
  • 输出结果:Pyarmor 会在当前目录下生成一个 dist/ 文件夹。
  • dist 内的文件结构
  • main.py:这是加密后的入口脚本,体积很小,里面只包含调用加密运行库的引导代码。
  • pyarmor_runtime_xxxxxx/:这是配套的运行时库(包含二进制 .pyd 或 .so 文件),负责在内存中解密执行代码。

  • 如何运行:直接进入 dist 目录正常执行即可:

    cd dist
    python main.py
    

2. 加密整个项目(包含子目录)

如果你的项目包含多个模块、子文件夹或是一个完整的 Python 包:

pyarmor gen --recursive --output dist/my_project/ src/
  • --recursive:递归加密 src/ 目录下的所有 .py 文件。
  • --output:指定加密后的输出目录。

三、 高级安全防护(防止高级反编译)

默认的加密只应对普通的反编译。如果你需要对抗更专业的逆向分析,可以在生成时加上以下安全增强参数:

pyarmor gen --enable-jit --mix-str --assert-call --private main.py
  • --enable-jit:启用即时编译(JIT)技术,在运行时动态生成关键的 C 语言解密函数,大幅增加逆向难度。
  • --mix-str:混淆脚本中长度大于 8 的字符串常量(例如将明文的 API 密钥、数据库密码变成密文)。
  • --assert-call:确保被调用的函数也是经过加密的,防止黑客通过 Hook(钩子)动态替换外部函数。
  • --private:保护模块内的变量和属性,防止未加密的脚本直接导入(import)并读取你的模块属性。

四、 授权管理(限制过期时间、绑定设备)

这是 Pyarmor 非常惊艳的功能,允许你为代码制作“许可证”。

1. 限制脚本的有效期限

如果你希望代码作为试用版,并在特定日期后失效(例如 2026 年底):

pyarmor gen -e 2026-12-31 main.py

超过该日期后,用户运行程序会直接抛出运行许可证过期异常。

2. 绑定特定机器运行(防止盗版分发)

你可以限制代码只能在客户的特定服务器上运行。

第一步:让客户在目标机器上运行以下命令获取硬件信息(网卡 MAC 地址、硬盘序列号等):

python -m pyarmor.cli.hdinfo

假设获取到客户的网卡 MAC 地址为 00:16:3e:35:19:3d。

第二步:在你自己的机器上,生成绑定该硬件的加密脚本:

pyarmor gen --bind-disk "00:16:3e:35:19:3d" main.py

💡 避坑指南(新手必看)

  1. 切勿加密虚拟环境:使用 --recursive 加密项目时,绝对不要把 .venv 或 site-packages 目录包含进去,只加密你自己写的核心源码。
  2. 跨平台不通用:因为运行时库包含编译后的二进制代码(如 Windows 的 .pyd,Linux 的 .so),所以在 Windows 上生成的 dist 文件夹无法直接拿到 Linux 上运行。如果目标环境是 Linux,请直接在 Linux 系统上执行 pyarmor gen。
  3. 动态特性受限:加密后,Python 的部分动态反射特性(例如 inspect 模块、sys._getframe())可能会失效。如果你的项目重度依赖某些复杂的第三方框架(如 pandas 或 cherrypy 的某些特殊内部调用),请在打包后务必进行全量集成测试。