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 包含运行加密脚本所需要的全部文件:
image.png
运行加密脚本:
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
当出现这个问题,依次进行下面的检查
检查运行加密脚本的 Python 的版本和加密脚本的 Python 版本是否一致
尝试移动全局密钥箱 ~/.pyarmor_capsule.zip到其他任何目录,然后重 新加密脚本
确保生成许可使用的密钥箱和加密脚本使用的密钥箱是相同的(当运行 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
更多使用请看官方文档:PyArmor