PyArmor加密保护发布的python程序

PyArmor 是一个用于加密和保护 Python 脚本的工具。它能够在运行时刻保护 Python脚本的二进制代码不被泄露,设置加密后 Python 源代码的有效期限,绑 定加密后的Python源代码到硬盘、网卡等硬件设备。

安装 PyArmor

可以直接从这里 PyPi 下载, 但是更方便的方式是通过 pip ,直接 运行下面的命令进行安装:

pip install pyarmor

需要升级的话,执行下面的命令:

pip install --upgrade pyarmor

一旦成功安装,查看版本号 ,例如:

pyarmor --version

使用 PyArmor

命令 pyarmor 的基本语法为:

pyarmor [command] [options]

加密脚本

命令 obfuscate 用来加密脚本。最常用的一种情况是切换到脚本 main.py 所在的路径,然后执行:

pyarmor obfuscate main.py

PyArmor 会加密 main.py 和相同目录下面的所有 *.py 文件:

  • 创建输出子目录 dist
  • 生成加密的主脚本 main.py 保存在输出目录 dist
  • 加密相同目录下其他所有 *.py 文件,保存到输出目录 dist
  • 生成运行加密脚本所需要的全部辅助文件,保存到输出目录 dist

输出目录 dist 包含运行加密脚本所需要的全部文件:

运行加密脚本:

cd dist  
python myscript.py

常见错误

NameError: name ' pyarmor ' is not defined

原因是 引导代码 没有被执行。

from pytransform import pyarmor_runtime
pyarmor_runtime()

当使用模块subprocess 或者 multiprocessing , 调用 Popen 或者 Process 创建新的进程的时候,确保 引导代码 在新进程中也得到执 行。否则新进程是无法使用加密脚本的。

Marshal loads failed when running xxx.py

当出现这个问题,依次进行下面的检查

  1. 检查运行加密脚本的 Python 的版本和加密脚本的 Python 版本是否一致
  2. 尝试移动全局密钥箱 ~/.pyarmor_capsule.zip到其他任何目录,然后重 新加密脚本
  3. 确保生成许可使用的密钥箱和加密脚本使用的密钥箱是相同的(当运行 PyArmor 的命令时,该命令使用的密钥箱的文件名称会显示在控制台)

'gbk' codec can't decode byte 0xa1 in position 28: illegal multibyte sequence

1、升到最新版
2、在加密脚本顶部加# -*- coding: utf-8 -*-
3、修改源码,在源码中找到utils.py文件,在439行中

    with open(filename,'r',encoding=encoding) as f:

将encoding改为'utf-8'

    with open(filename,'r',encoding='utf-8') as f:

就可以解决绝大部分问题了

其他: 查看具体报错信息:

    set PYTHONDEBUG=y
    pyarmor obfuscate hello.py

更多使用请看官方文档 https://pyarmor.readthedocs.io/en/latest/