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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM