使用 Cython 编译将.py文件加密成.so文件
文章目录
- 1. .so文件的核心意义和优势
- 2. 使用 Cython 编译,将.py文件加密成.so文件
最近在学习在服务器上如何部署Python模型,不学不知道,一学吓一跳,要学好多啊,最近看到什么就记录一下什么吧。
1. .so文件的核心意义和优势
在服务器上部署时会有Python的将 .py 文件编译为 .so(Linux)或 .pyd(Windows)文件,主要有以下核心意义和优势:
1. 代码保护与加密
- 防止源码泄露
.so 是二进制文件,无法直接阅读,保护核心算法或商业逻辑(尤其对闭源项目至关重要)。 - 规避反编
译风险 相比 .pyc(Python 字节码),.so 更难逆向工程,安全性更高。
2. 性能优化 - 加速执行
Cython 将 Python 代码编译为 C 扩展,计算密集型任务(如数值计算、循环)性能可提升 10-100 倍。 - 减少解释器开销
直接调用编译后的机器码,跳过 Python 解释器的动态类型检查。
3. 依赖简化 - 隐藏第三方库依赖
编译时可将部分依赖静态链接到 .so 中,减少服务器环境配置的复杂性。 - 避免环境冲突
二进制文件对 Python 版本和操作系统有明确要求,强制环境一致性。
4. 部署便利性 - 无源码部署
只需分发 .so 文件,无需暴露源代码,适合交付客户或云服务器部署。 - 跨平台兼容性
通过交叉编译生成目标平台的 .so,适配不同服务器环境(需匹配 Python 版本和 OS)。
5. 资源控制 - 内存管理优化
Cython 支持手动管理内存(如 cdef 定义 C 类型变量),减少 Python 垃圾回收压力。 - 系统调用集成
可直接调用 C/C++ 库,实现底层操作(如高性能 IO、硬件加速)。
2. 使用 Cython 编译,将.py文件加密成.so文件
直接演示在jupyter上如何使用 Cython 编译,将.py文件加密成.so文件
安装cython包
!pip install cython
安装成功会显示入下图
由于我在jupyter上,Python文件后缀为.ipynb,需要先转换成.py文件,再加密成.so文件
# 1 将.ipynb 文件转换保存为 .py文件
import nbformat
from nbconvert import PythonExporter# 2.读取 .ipynb 文件
with open("entropy_weight.ipynb", "r", encoding="utf-8") as f:notebook = nbformat.read(f, as_version=4)# 3.转换为 .py
exporter = PythonExporter()
python_code, _ = exporter.from_notebook_node(notebook)# 4.保存为 .py 文件
with open(r"C:\Users\xxx\Desktop\entropy_weight.py", "w", encoding="utf-8") as f:f.write(python_code)
%%writefile setup.py
## 必须要在第一行
from distutils.core import setup
from Cython.Build import cythonize
# 5 创建 setup.py 编译脚本
setup(ext_modules=cythonize(r"C:\Users\xxx\Desktop\entropy_weight.py"))
# 6. 编译命令
!python setup.py build_ext --inplace
✅ 你的编译已成功,生成了Windows平台的 .pyd 文件,而非 .so(entropy_weight.cp311-win_amd64.pyd)
✅ 使用 import entropy_weight 可直接调用
调用.so文件
import entropy_weight #导入原始的entropy_weight.py文件
import pandas as pddt= pd.read_excel(r"D:\data.xlsx",sheet_name='副本')
dt = dt.iloc[:,3:6].dropna()
dt.columns = ['字段1','字段2','字段3']# 7. 调用 entropy_weight里的函数cal_weight
w,S = entropy_weight.cal_weight(dt)
w.index = dt.columns
w.columns = ['weight']
S.columns = ['score']
print('指标权重\n',w,'\n')
print('样本综合得分\n',S)
print('\n计算完成!')