1. 程式人生 > 其它 >py檔案編譯成so檔案並呼叫,達到加密目的

py檔案編譯成so檔案並呼叫,達到加密目的

技術標籤:Python

0. 前言

最近做的一個flask專案要交給客戶部署,但是老師不讓把程式碼都給他們,所以需要將程式碼加密。在Java中我們可以提供位元組碼檔案,但是python中編譯得到的pyc檔案可直接反編譯為原始碼, 所以需要先將核心模組編譯成 .so檔案。一開始現在把整個專案都加密,解決無果決定只將核心演算法檔案加密。

distutils可以用來在Python環境中構建和安裝額外的模組.
新的模組可以是純Python的,也可以是用C/C++寫的擴充套件模組,或者可以是Python包,包中包含了由C和Python編寫的模組.
配合使用Cython.Build.cythonize可將py編譯成.so檔案

1. 環境準備

安裝cython,以及gcc編譯環境

sudo apt-get install python-devel
sudo apt-get install gcc
pip install cython

2. 待編譯檔案

假如是以下檔案test.py:

def test():
    print("hello python!")
     
def add(a, b):
    print(a + b)
    return a + b

3. 編譯工具

編寫setup.py檔案,與待編譯檔案test.py在同一個包下面,注意:此包還要有__init__.py檔案,方便匯入。因此此包有三個py檔案。setup.py檔案內容如下:

from distutils.core import setup
from Cython.Build import cythonize
 
setup(
    ext_modules = cythonize("test.py")
)

4. 編譯

執行下面命令。linux上會生成test.so檔案。可以刪除test.py檔案了。

python setup.py build_ext --inplace

注意這一步,因為我的專案是flask專案,有好幾層包,會有一些相互引用,所以生成了兩個資料夾,一個是build,一個是App。這裡我沒有細緻研究,我是將他們都刪掉,只保留一個.so檔案。

在這裡插入圖片描述
比如我這裡的simu_cacu.cpython-36m-x86_64-linux-gnu.so檔案就是編譯simu_cacu.python得到的,我把simu_cacu.py檔案刪掉,這個.so檔案就起到了和之前.py檔案同樣的作用,而不用修改其他呼叫的程式碼。

5. 測試

在互動式終端(或者寫程式碼測試)中測試test.so檔案,可以直接呼叫

>>> import test
>>> test.test()