使用 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 pd

dt= 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计算完成!')

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值