将项目核心.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控制