利用cython将.py文件编译为.pyd文件

文章目录

  • 1. 引言
  • 2. py文件编译为pyd文件步骤
    • 2.1 环境准备
    • 2.2 准备setup.py文件
    • 2.3 进行编译
  • 3. 测试代码


1. 引言

在实际的Python开发中,为了防止Python脚本源码暴露,常常需要对python源码文件进行加密保护,Python的原始文件格式为.py,可以通过编译生成 .pyc/.pyo/.pyd 等类型的文件,其中,.pyc/.pyo 是python字节码文件,但由一些较低版本的解释器编译的字节码可以通过 uncompyle6 库进行反编译,而 .pyd 是 windows 平台上的 python 动态链接库文件,通常包含了编译后的二进制代码,相比于 .pyc 文件更难反编译,因为其中包含的是机器码而不是字节码(可以被反汇编,但难度大)。

因此,接下来我们将介绍如何将.py 文件编译为 .pyd 文件,并通过相应代码演示具体过程。

2. py文件编译为pyd文件步骤

2.1 环境准备

编译为 .pyd 文件需要用到 Cython 库,且由于 Cython 编译器需要使用 C/C++ 编译器来将 Cython 代码编译成动态链接库文件,因此还需要在环境中准备 C/C++ 编译器。

  1. 安装 Cython:通过pip install cython 即可实现安装;
  2. 安装 C/C++ 编译器:Microsoft C++ 生成工具是 Windows 平台上常用的 C/C++ 编译器之一,也是Visual Studio的一部分,因此通常通过安装 Visual Studio 来实现安装(下载地址)。

2.2 准备setup.py文件

假设现有一个待加密的名为 example.py 的文件,文件内容如下:

import numpy as npdef cal(array_):print("Mean of array: ", np.mean(array_))print("Median of array: ", np.median(array_))

有待加密文件后,需准备 setup.py 文件,文件内容如下:

from distutils.core import setup
from Cython.Build import cythonizesetup(ext_modules=cythonize(["example.py"]))

其中的 distutils 是 python 的内置库,将待加密文件的文件名如上所示设置即可,如果有多个.py文件,则将多个文件名用逗号隔开。

2.3 进行编译

打开 cmd 窗口,将当前目录切换到上面提到的 example.pysetup.py 的所在目录,执行以下命令:

python setup.py build_ext --inplace

运行时生成的信息,说明加密完成。此时加密得到 example.cp310-win_amd64.pyd,如果该文件不在当前工作目录中,则到 build 文件的 lib.win-amd64-cpython-310 当中查找。这里的 310 指的是 python 版本为 3.10,之所以有这个版本区别,是要求调用相应 pyd 文件的环境和编译 pyd 的 python 的环境版本要一致。如果在不同环境版本之间编译和调用,可以考虑用环境管理根据:安装conda并搭建python环境(入门教程)

在这里插入图片描述
在这里插入图片描述

此时将得到的 example.cp310-win_amd64.pyd 文件中的 .cp310-win_amd64 部分删除,得到 example.pyd,其使用方法与普通的 py 文件一致。

3. 测试代码

上面加密的代码中定义了一个函数,当传入一个数组或者列表后,打印传入数据的平均值,和中位数值。切换到 .pyd 所在的目录下,运行如下测试代码:

import exampleexample.cal([1,5,3,2,0])

打印结果如下:

Mean of array:  2.2
Median of array:  2.0

除了后缀不同,加密后的文件应该与加密前文件名保持一致,否则会在引用时出错,当 example.pyexample.pyd 同在一个目录下时,上述测试代码中的 import example 会优先引用 .pyd 文件。

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

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

相关文章

在outlook的邮件中插入HTML;HTML模板获取;页面组态手动生成HTML

本文介绍如何在outlook发送邮件时,在邮件中插入HTML,此HTML可以从获取模板自行进行修改。 文章目录 一、下载HTML模板(或自己制作好HTML文件)二、outlook新增宏三、新建邮件,插入HTML四、通过图像化页面组态手动生成HT…

做场外个股期权怎么询价

做场外个股期权怎么询价?没有具体的哪家做市商是询价是最低的,个人投资者需要通过机构通道方询价进行对比,各券商的报价由询价机构方提供给到投资者,可以参考不同券商的报价进行比对,再决定是否进行投资。本文来自&…

操作系统复习-操作系统概述

操作系统概述 操作系统的基本功能 操作系统统一管理着计算机资源: 处理器资源IO设备资源存储器资源文件资源 操作系统实现了对计算机资源的抽象: 用户无需向硬件接口编程IO设备管理软件,提供读写接口文件管理软件,提供操作文…

关于验证码的那些漏洞

一、短信轰炸 这类漏洞存在的原因是没有对短信验证码的发送时间、用户及其IP作一些限制。 案例1、正常的短信轰炸 burp一直发包即可 案例2、并发绕过 做了限制咋办?可以试试并发(万物皆可并发) 使用turbo intruder插件进行并发。 并发次数越大是不是轰炸就越多。 …

宝塔安装java环境Jdk1.8

1.打开宝塔——选择“终端”——输入SSH的服务器IP和SSH账号,选择密码验证,输入密码 2。登录成功后,输入:yum list java-1.8*,用于列出所有与 “java-1.8” 相关的软件包 yum list java-1.8* 3.安装Jdk1.8: yum insta…

[leetcode hot150]第二百三十六题,二叉树的最近公共祖先

题目: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个…

【C++】前缀和:一维前缀和

1.题目 2.算法思路 如果暴力求解的话,时间复杂度为O(n*q)。一定会超时。 优化的思路也很简单,就是得到一个求和数组arr,使arr[i]a1a2...ai。 然后每次求l到r之间的数时,直接arr[r]-arr[l-1]就可以得出! 这样&#…

从GPT-3.5到GPT-4O:探索AI的进化之旅,哪一版更懂你?

如何评价GPT-4o? 最新的GPT-4O,被誉为GPT-4的增强版。它在保持前代产品优秀性能的基础上,大幅降低了使用成本,使得更多的普通用户也能享受到顶尖AI的服务。GPT-4O在非英语语言处理上的强化,更是让其在全球范围内的适用性大大提高…

Linux 编译器gcc/g++使用

gcc/g同理 编译器运行过程 1. 预处理(进行宏替换) gcc -E a.c -o a.i 预处理后还是c语言 -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面 告诉gcc,从现在开始进行程序的翻译,将预处理工作做完停下 2. 编译&#x…

【RSGIS数据资源】1981-2021年中国陆地生态系统蒸腾蒸散比数据集

文章目录 摘要基本信息数据结构和内容采集方法信息数据处理方法与数据质量 摘要 本数据集涵盖了中国陆地生态系统蒸腾蒸散比(T/ET)、蒸腾(T)及蒸散(ET)三组数据。基于模型-数据融合方法,集成PT…

树与图的深度优先遍历

数和图的存储方式与遍历 数和图的存储方式: 一般有两种 树是一种特殊的图(即无环联通图)。所以下面只讲图。 图的话分为两种:①有向图(边是有方向的:a➡️b)和 ②无向图(边是无方…

HNU-计算机体系结构-实验2-Tomasulo算法

计算机体系结构 实验2 计科210X 甘晴void 202108010XXX 1 实验目的 熟悉Tomasulo模拟器同时加深对Tomasulo算法的理解,从而理解指令级并行的一种方式-动态指令调度。 掌握Tomasulo算法在指令流出、执行、写结果各阶段对浮点操作指令以及load和store指令进行什么…

网络融合的力量:企业如何通过“一网多用”提升业务效率

随着企业业务的不断扩展,网络需求变得日益复杂。需要的是一种能够统一承载办公、生产、销售和运营等多业务需求的网络架构。这种“一网多用”的架构,不仅简化了网络部署和管理,还提升了效率并降低了成本。 “一网多用”架构的实际应用&#x…

Guns框架:基于主流技术Spring Boot2 + Vue3 + Antd Vue的现代Java应用开发新纪元

Guns框架:基于主流技术Spring Boot2 Vue3 Antd Vue的现代Java应用开发新纪元 摘要:随着信息技术的飞速发展,软件开发框架在提升开发效率、降低成本方面扮演着至关重要的角色。Guns框架,作为一个现代化的Java应用开发框架&#x…

微信图片识别文字怎么弄?介绍三个识别方法

微信图片识别文字怎么弄?在信息爆炸的时代,我们每天都会接触到大量的图片信息,其中包含的文字内容往往是我们获取信息的重要途径。然而,手动输入图片中的文字既费时又费力,这时,一款能够准确识别微信图片中…

学习笔记——动态路由协议——OSPF(OSPF基本术语)

OSPF基本术语 1、链路状态(LS)与链路状态通告(LSA) 链路(LINK):路由器上的一个接口。 状态(State):描述接口以及其与邻居路由器之间的关系。 (1)链路状态(LS) OSPF是一种链路状态协议,所谓的链路状态,其实就是路由器的接口状态…

QGIS开发笔记(三):Windows安装版二次开发环境搭建(下):将QGis融入QtDemo,添加QGis并加载tif遥感图的Demo

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/139136356 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

29-ESP32-S3-WIFI篇-00 STA模式扫描全部 AP

ESP32-S3 WIFI_Driver 引言 ESP32-S3是一款集成了Wi-Fi和蓝牙功能的芯片。关于WIFI的部分,其实内容比我想象的要多得多。所以通常来说,如果你想要编写自己的Wi-Fi应用程序,最快捷的方法就是先找一个类似的示例应用,然后将它的相…

实战项目:飞机坦克大战 —— 面向对象编程之旅

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、项目概览与背景介绍 二、面向对象编程基本概念解析 1. 类与对象 2. 构造函数与属性封…

Java对象的揭秘

前言 作为一个 Java 程序员,我们在开发中最多的操作要属创建对象了。那么你了解对象多少?它是如何创建?如何存储布局以及如何使用的?本文将对 Java 对象进行揭秘,以及讲解如何使用 JOL 查看对象内存使用情况。 本文是基…