Python源码的编译与加密


cnblog: Python生成pyd文件

Python的脚本文件是开源的,量化策略的安全性没有保障。因此需要保护源码。那么要对Python代码进行混淆、加密保护。

  • 混淆代码,可以使用pyminifier。
  • 而加密处理,就比较麻烦。Python有py、pyc、pyw、pyo、pyd等文件格式。
    • 其中,pyc是二进制文件。但很容易被反编译。

    • pyw也不行,只是隐藏命令行界面而已,可以作为入口脚本。

    • pyo和pyc差不多,也容易被反编译。

    • 最后剩下pyd格式。

      pyd格式是D语言(C/C++综合进化版本)生成的二进制文件,实际也会是dll文件。该文件目前位置没找到可以被反编译的消息,只能被反汇编。Sublime text编辑器也是使用该格式。

1. pyc

1.1. 编译单独的pyc

对于py文件,可以执行下面命令来生成pyc文件,转化后的.pyc文件将在当前目录的__pycache__文件夹下.

python -m compileall <dir>

另外一种方式是通过代码来生成pyc文件,同样转化后的.pyc文件将在当前目录的__pycache__文件夹下.

import py_compile
py_compile.compile('/path/to/foo.py')

1.2. 批量编译pyc

python -m compileall <dir>

针对一个目录下所有的py文件进行编译。python提供了一个模块叫 compileall ,具体请看下面代码:

import compileall
compileall.compile_dir(r'/path')

2. pyd

pyd的本质是将python转换为 *.c 文件,然后编译为 *.dll/*.so

pip install Cython --install-option="--no-cython-compile"

或者自己下载安装:https://pypi.python.org/pypi/Cython/

写一个测试用的py文件 my_module.py :

def test():
    print("Hello World!")

创建 setup.py 文件

from distutils.core import setup
from Cython.Build import cythonize

setup(name = 'Hello world', ext_modules = cythonize("my_module.py"))

编译

python setup.py build  # 生成.c文件
python setup.py install  # 生成pyd文件,根据运行过程提示,pyd被生成到了python根目录下Lib/site-packages中,可以直接使用

输出结果:

$ py setup.py install

running install
running build
running build_ext
running install_lib
copying build/lib.linux-x86_64-3.6/my_module.cpython-36m-x86_64-linux-gnu.so -> /home/brt/.enpy/test/lib64/python3.6/site-packages
running install_egg_info
Writing /home/brt/.enpy/test/lib64/python3.6/site-packages/Hello_world-0.0.0-py3.6.egg-info

在Linux系统下,生成了 my_module.cpython-36m-x86_64-linux-gnu.so ,并支持直接直接载入:

import my_module
my_module.test()
posted @ 2021-01-05 19:30  brt2  阅读(1279)  评论(0编辑  收藏  举报