使用Cython编译Python源码加密加速,有这一篇就够了!

0 前言

python是一门脚本语言,运行时由python虚拟机解释执行。当我们使用python设计好算法给第三方使用时只能提供源码,任何运行我们算法的人都可以看到源码以及对应的算法思路。因此,需要一定手动保护源码。

最简单的保护方式是使用代码混淆,加大阅读难度。但这只是加大阅读难度,对方只要花点时间,还是可以理解算法思路。今天介绍使用Cythonpython源码编译成库文件(Windows平台为pyd文件,Linux平台为so文件),用户拿到库文件后,无法反编译为python源码,从而保证了代码安全性。另外,还能达到代码运行加速效果。关于Cython更详细内容这里不过多介绍,本文主要介绍如何使用Cythonpython编译为库文件使用。

最近看到一个巨牛的人工智能教程,分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。平时碎片时间可以当小说看,【点这里可以去膜拜一下大神的“小说”】。

1 场景实战

mobilenet v3识别ImageNet为例,项目目录如下所示:
初始算法项目结构
核心代码在src根目录下,各个代码文件作用:

  • src/model/mobilenetv3.py:定义模型网络结构
  • src/service/model_service.py: 定义模型创建、推理
  • test_img/test.jpg: 定义测试图片,图片内容为一架飞机
  • weights/mobilenetv3_small_67.4.pth.tar: 训练好的模型参数
  • test.py: 测试代码

看看test.py具体代码,其他文件无需过于关注,感兴趣的读者可以翻阅到本文末端获取完整代码。test.py具体代码如下:

from src.service.model_service import load_model, infermodel = load_model("weights/mobilenetv3_small_67.4.pth.tar")class_idx, score = infer(model, "test_img/test.jpg")
print(class_idx, score)

运行上面代码,输出结果如下:

404 0.8282396

Imagenet中,索引为404的类别为客机,可以看到整体运行没有问题。

2 算法源码加密

好了,有了上面的算法场景后,接下来我们对以上场景中的算法源码加密。

2.1 环境准备

安装Cython

执行如下命令安装Cython

pip install Cython

安装c/c++编译环境

对于Linux读者,只要有gcc编译环境即可,这里不过多介绍。

对于windows读者,安装好最新的VisualStudio即可。没有安装VisualStudio的读者,可以前往https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/下载。

本文是在Winodws平台,使用VisualStudio 2022编译环境运行。

2.2 编写编译代码

注意,实际的编译代码由Cython实现,我们只是简单使用。主要是设置本地需要编译成pyd(或so)的python文件,无其他复杂内容, 读者可以直接拿去使用,注意修改代码根路径即可。创建文件compile.py内容如下:

import os
from setuptools import setup
from distutils.extension import Extension
from distutils.command.clean import clean
from Cython.Distutils import build_extdef load_all(root):out = []if os.path.isdir(root):out.append((root, True))names = os.listdir(root)for name in names:p = os.path.join(root, name)if os.path.isdir(p):out += load_all(p)else:out.append((p, False))else:out.append((root, False))return outdef load_files(root, exts=("py",)):out = []for (p, is_dir) in load_all(root):if not is_dir:ext = p.split(".")if len(ext) > 1 and ext[-1] in exts:out.append(p)return outdef get_packages(root):out = []for (p, is_dir) in load_all(root):if is_dir:out.append(p)return out# ex_files参数可以支持不在src文件夹下的文件进行加密
def get_extensions(root):py_files = load_files(root, exts=("py",))ext_names = map(lambda x: x.replace(os.path.sep, '.')[:-3], py_files) def make_extension(ext_name):ext_path = ext_name.replace('.', os.path.sep) + '.py'ext = Extension(ext_name, [ext_path], include_dirs=['.'])ext.cython_directives = {'language_level': "3"}return extextensions = map(lambda x: make_extension(x), ext_names)return list(extensions)# 对加密后的py,pyc和c文件进行清除
class CleanCode(object):def clean_build(self, distribution):clean_command = clean(distribution)clean_command.all = Trueclean_command.finalize_options()clean_command.run()def delete(self, root, exts):src_files = load_files(root, exts=exts)for source_file in src_files:if os.path.basename(source_file):os.remove(source_file)def clean_pro(self, root):self.delete(root, exts=("pyd", "pyc", "c", "so"))def delete_source_code(self, root):self.delete(root, exts=("py", "c")) MODULE_NAME = "mobilenet_test"   # 给项目名字
root = "src" 
# 继承Cython的build_ext类  
class CustomBuildExt(build_ext, CleanCode):def run(self):self.clean_pro(root)build_ext.run(self)self.clean_build(self.distribution)self.delete_source_code(root)  # 清理源代码,只保留编译后文件setup(name=MODULE_NAME,packages=get_packages(root),ext_modules=get_extensions(root),cmdclass={'build_ext': CustomBuildExt}   # 自定义的CustomBuildExt
)

注意第73行代码定义了需要编译的python代码根目录。执行上面代码后,会自动清理掉原始的python源码,读者需要做好备份。如果读者想保留原始python代码,将第81行注释即可。具体执行以上代码命令为:

python compile.py build_ext --inplace

执行后,项目结构如下:

编译后的算法项目结构
编译后的算法代码是二进制汇编代码,已经无法反编译:
编译后的算法库文件

原始的算法代码无需任何修改,继续执行test.py文件:

python test.py

输出如下:

404 0.8282396

可以看到输出内容一模一样

3 获取源码

  1. 关注公众号:Python学习实战
  2. 公众号聊天界面回复:Cython示例,获取完整源码。

如果您觉得本文有帮助,辛苦您点个不需花钱的赞,您的举手之劳将对我提供了无限的写作动力! 也欢迎关注我的公众号:Python学习实战, 第一时间获取最新文章。
关注【Python学习实战】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高光谱图像聚类的像素-超像素对比学习与伪标签校正

Pixel-Superpixel Contrastive Learning and Pseudo-Label Correction for Hyperspectral Image Clustering 文章目录 Pixel-Superpixel Contrastive Learning and Pseudo-Label Correction for Hyperspectral Image Clustering摘要引言相关方法对比学习 方法超像素对比学习像素…

【嵌入式】智能系统优化:【C++】驱动的【机器学习】与【数据挖掘】技术

目录 一、嵌入式系统简介 二、C在嵌入式系统中的优势 三、机器学习在嵌入式系统中的挑战 四、C实现机器学习模型的基本步骤 五、实例分析:使用C在嵌入式系统中实现手写数字识别 1. 数据准备 2. 模型训练与压缩 3. 模型部署 六、优化与分析 1. 模型优化 模…

什么时候用C而不用C++?

做接口只用C,千万别要C。C是编译器敏感的,一旦导出的接口里有 std::string这些东西,以及类,注定了要为各个编译器的各个版本准备独立的库。 刚好我有一些资料,是我根据网友给的问题精心整理了一份「C的资料从专业入门…

Gitlab---添加描述模版

0 Preface/Foreword Gitlab是代码托管平台,DevOps。因其免费,被广泛使用。GitLab不但可以管理代码,也可以管理issue,创建milestone等等。针对issue管理,支持描述模版功能,即对于新建的issue,可…

深度网络学习笔记(二)——Transformer架构详解(包括多头自注意力机制)

Transformer架构详解 前言Transformer的整体架构多头注意力机制(Multi-Head Attention)具体步骤1. 步骤12. 步骤23. 步骤34. 步骤4 Self-Attention应用与比较Self-Attention用于图像处理Self-Attention vs. CNNSelf-Attention vs. RNN Transformer架构详…

【第11章】SpringBoot实战篇之文章(下)含条件分页

文章目录 前言一、文章列表查询1. ArticleController2. ArticleService 二 、文章查询1. ArticleController2. ArticleService 三、文章更新1. ArticleController2. ArticleService 四、文章删除1. ArticleController2. ArticleService 五、文章列表查询(条件分页)1.ArticleCon…

医疗器械网络安全风险管理的基本步骤

医疗器械网络安全风险管理是一个复杂的过程,涉及到多个环节和步骤。以下是一些基本的步骤和关键点: 风险识别:首先需要对医疗器械的软件、网络连接和通信协议等进行漏洞分析,识别潜在的安全漏洞和弱点。这可能涉及对设备的渗透测…

MbedTLS源码跨平台编译(window/macos/linux)

1.window平台编译: 克隆: git clone --recursive https://github.com/Mbed-TLS/mbedtls.git 克隆成功 添加OpenSSL环境变量 验证环境 使用cmake编译 cmake ../生成配置时出错 出现上面原因是克隆下来的library与programs及tests目录少文件了,直接下载zip包替换library目录

docker pull image 报错 dial tcp 31.13.88.169:443: i/o timeout

一、错误重现 error pulling image configuration: download failed after attempts6: dial tcp 31.13.88.169:443: i/o timeout 在执行docker build构建镜像,拉取镜像时报错 或者直接docker pull镜像时报错 实质都是拉取镜像源超时报错,那么就是镜像源…

Java sql中 >、<、≥、≤ 等的转义字符 代替符号

Java中写sql会遇到一些 >、<、≥、≤ 符号转化问题&#xff0c;导致sql语句无法运行。 替代方法如下&#xff1a; 第一种方法&#xff1a; < &#xff1a; < < &#xff1a; < > &#xff1a; > > &#xff1a; > sql示例如下&#x…

IEDA 默认集成依赖概述

IEDA 默认集成依赖概述 目录概述需求&#xff1a; 设计思路实现思路分析 1.Developer Tools:GraalVM Native supportGraphQL DGs Code GenerationSpring Boot DevToolsLombokSpring Configuration ProcessorDocker Compose supportSpring Modulith 2.WebWebSpring WebSpring Re…

详解 Flink 的 window API

一、window 概述 ​ Streaming 流式计算是一种被设计用于处理无限数据集的数据处理引擎&#xff0c;而无限数据集是指一种不断增长的本质上无限的数据集&#xff0c;而 Flink window 是一种将无限数据切割为有限块进行处理的手段。window 是无限数据流处理的核心&#xff0c; …

单片机原理及技术(三)—— AT89S51单片机(二)(C51编程)

一、AT89S51单片机的并行I/O端口 1.1 P0口 AT89S51的P0口是一个通用的I/O口&#xff0c;可以用于输入和输出。每个引脚都可以通过软件控制为输入或输出模式。 1.1.1 P0口的工作原理 P0口的工作原理是通过对P0寄存器的读写操作来控制P0口的引脚。 输出模式&#xff1a;当P0口…

UI学习笔记(一)

UI学习 一&#xff1a;UIView基础frame属性隐藏视图对象&#xff1a;UIView的层级关系 二&#xff1a;UIWindow对象三&#xff1a;UIViewController基础UIViewController使用 四&#xff1a;定时器与视图移动五&#xff1a;UISwitch控件六&#xff1a;滑动条和进度条七&#xf…

2021年vue面试题整理(万字解析)

一、对MVVM的理解 MVVM分为Model、View、ViewModel。 Model 代表数据模型&#xff0c;数据和业务逻辑都在Model层中定义&#xff1b;泛指后端进行的各种业务逻辑处理和数据操控&#xff0c;对于前端来说就是后端提供的 api 接口。 View 代表UI视图&#xff0c;负责数据的展示…

【Python数据分析--Numpy库】Python数据分析Numpy库学习笔记,Python数据分析教程,Python数据分析学习笔记(小白入门)

一&#xff0c;Numpy教程 给大家推荐一个很不错的笔记&#xff0c;个人长期学习过程中整理的 Python超详细的学习笔记共21W字点我获取 1-1 安装 1-1-1 使用已有的发行版本 对于许多用户&#xff0c;尤其是在 Windows 上&#xff0c;最简单的方法是下载以下的 Python 发行版…

Swift 序列(Sequence)排序面面俱到 - 从过去到现在(一)

概览 在任何语言中对序列(或集合)元素的排序无疑是一种司空见惯的常规操作,在 Swift 语言里自然也不例外。序列排序看似简单,实则“暗藏玄机”。 要想真正掌握 Swift 语言中对排序的“各种姿势”,我们还得从长计议。不如就先从最简单的排序基本功开始聊起吧。 在本篇博…

【十大排序算法】插入排序

插入排序&#xff0c;如一位细心的整理者&#xff0c; 她从序列的左端开始&#xff0c; 挨个将元素归位。 每当她遇到一个无序的元素&#xff0c; 便将它插入已经有序的部分&#xff0c; 直至所有元素有序排列。 她不张扬&#xff0c;却有效率&#xff0c; 用自己的方式&…

pdf文件在线压缩网站,pdf文件在线压缩工具软件

在数字化时代的今天&#xff0c;PDF文件已经成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着PDF文件的广泛使用&#xff0c;其文件大小问题也日益凸显。过大的PDF文件不仅占用了大量的存储空间&#xff0c;而且在传输和共享过程中也往往面临诸多不便。因此&am…

SylixOS网卡多 IP 配置

概述 网卡多 IP 是指在同一个网络接口上配置和绑定多个 IP 地址。 引进网卡多 IP 的目的主要有以下几个&#xff1a; 提供服务高可用性。通过在同一接口绑定多个 IP 地址&#xff0c;然后在服务端使用这些 IP 地址启动多个服务实例。这样在任意一 IP 出现问题时&#xff0c;可…