【代码编译】项目核心python代码编译为.so文件

1,736 阅读2分钟

将项目核心.py文件编译为.so文件并调用

前言

当我们完成项目代码开发并封装为服务交付给客户前,往往需要将项目中的核心代码进行加密编译,防止泄露商业机密。本文的主要目的是演示如何将python文件加密编译为.so文件,并通过实际项目demo进行演示。

操作步骤

1.准备依赖环境
pip install pycrypto Cython
2.准备compile_run.py
⚠️该文件主要是将代码转为so文件,并删除原来的py文件,所以在运行之前请将原文件做好备份。

# coding:utf-8
from distutils.core import setup
from Cython.Build import cythonize
import os
import shutil
'''
该文件的执行需要的在Terminal中输入  python compile_run.py build_ext --inplace
使用Cpython 编译python文件,关键函数编译成pyd文件(相当于dll)
'''
key_funs = []
files = os.listdir(os.getcwd())  # 得到文件夹下的所有文件名称
for file in files:  # 遍历文件夹
    if(file=='compile_run.py'):
        continue
    elif('.py' in file):
        key_funs.append(file)

setup(
    name="xxxx app",
    ext_modules = cythonize(key_funs),
)

'''
1、将编译后的pyd文件的命名更改成与原py文件一致
2、删除编译后得到的c文件和原py文件
'''
print("——————", os.getcwd(), "——————")

files = os.listdir(os.getcwd())
print(files)

for fi in files:
    if fi.__contains__(".pyd"):
        re_name = fi.split(".")[0] + ".pyd"
        print(re_name)
        os.rename(fi, re_name)
    elif fi.__contains__(".so"):
        re_name = fi.split(".")[0] + ".so"
        print(re_name)
        os.rename(fi, re_name)
    elif fi.__contains__(".c") or fi in key_funs:
        os.remove(fi)
        # if(fi in key_funs):
        #     os.remove(key_funs[key_funs.index(fi)])
    elif fi.__contains__("build"):
        shutil.rmtree("build")

3.代码架构与演示:
这里我们将test文件夹下的core_file.py文件编译为so文件,在正式编译前,先通过main.py测试一下效果。
3.1 core_file.py的文件内容:模拟核心代码,输出一个随机数
在这里插入图片描述
3.2 观察它处于代码架构的位置:
在这里插入图片描述
3.3 右键run main.py,可以得到:
在这里插入图片描述
4.编译核心代码
4.1 将准备好的compile.py文件放在test/下,也就是和core_file.py同级:
在这里插入图片描述
4.2 打开终端,执行命令:
python compile_run.py build_ext --inplace
在这里插入图片描述
4.3 观察代码目录:
在这里插入图片描述
4.4 再次右键run 执行main.py测试
在这里插入图片描述
4.5 发现能够调用so文件,执行成功
在这里插入图片描述

⚠️:编译后的.so文件需要和原py文件同名,比如test.py需要生成对应的test.so才行,将so文件放在原来py文件的位置就行。

参考:
[1] python代码加密以及python代码的License控制