1、Cython批量编译py文件
Cython是一个编程语言,它通过类似Python的语法来编写C扩展并可以被Python调用。能够将Python+C混合编码的.pyx脚本转换为C代码,主要用于优化Python脚本性能或Python调用C函数库。基于它的原理,可以得到一种代码加密的思路:将 .py/.pyx 编译为 .c 文件,再将 .c 文件编译为 .so(Unix) 或 .pyd(Windows),这样得到的文件更难反编译。
优点
- 生成的二进制 .so 或 .pyd 文件难以破解
- 同时带来了性能提升
不足
- 兼容性稍差,对于不同版本的操作系统,可能需要重新编译
- 虽然支持大多数 Python 代码,但如果一旦发现部分代码不支持,完善成本较高
批量加密代码:
from setuptools import setup, find_packages
pyfiles = ['autoTestPrj/*.py',
'autoTestPrj/ocr/*.py',
'autoTestPrj/tool/*.py']
for f in pyfiles:
setup(name='autoTestPrj_encrypt',
version='1.0.1',
description='aaaaaa',
author='aaaaaa',
author_email='aaaa@qq.com',
ext_modules=cythonize(f),
)
使用以下命令在setup.py目录下执行:
python setup.py build_ext --inplace
build_ext参数是一个命令,指示distutils构建扩展对象或cythonize调用创建的对象。 可选的--inplace标志指示distutils将每个扩展模块放在其各自的Cython .pyx源文件旁边
注意:这里我把__init__.py也生成了pyd文件,但是打包时一定要留着__init__.py,打包后安装会根据__init__.py查找文件夹,如果没有文件夹则不会安装该文件下的文件,建议__init__.py为空或尽量少写内容,否则依然可以通过__init__.py知道代码逻辑,加密就没有用了。
2、生成whl文件
如果直接打包,会把没有加密过的源码也打包进去,安装时会一同安装,那加密就没有意义了。所以可以先移除.py文件,再打包。
代码如下:
from setuptools import setup, find_packages
setup(name='autoTestPrj_encrypt',
version='1.0.1',
description='aaaaaa',
author='aaaaaa',
author_email='aaaa@qq.com',
packages=find_packages(),
include_package_data=True,
# 将pyd文件打包进入
package_data={
'': ['*.pyd'],
},
)
在cmd执行以下命令:
python setup.py bdist_wheel
打包完成后可以在dist文件下看到whl文件:
此时再进行安装:
pip install autoTestPrj_encrypt-1.0.1-py3-none-any.whl
安装完成可以输入:
pip show package_name
如果安装成功可以看到输出的包的信息和安装位置:
3、关于使用报错找不到模块
此时使用可能会提示找不到该模块
我们可以打包前把.pyd名称去掉生成时生成的“.cp39-win_amd64”这一串字符,然后再执行步骤2,安装好后就可以正常使用了
参考:Python源码保护 - 知乎