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