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

news2024/11/16 13:52:54

文章目录

  • 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 np

def 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 cythonize

setup(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 example

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

打印结果如下:

Mean of array:  2.2
Median of array:  2.0

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

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

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

相关文章

(IDEA修改Java版本)java: 警告: 源发行版 X 需要目标发行版 X

搜索关键词:一致、发行 错误信息 其他错误: java: 错误: 不支持发行版本 6 java: -source 1.5 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式) 思路 有两个地方要检查,JDK版本保持一致即可。 比如统一用JDK8或…

外卖系统开发的技术栈和架构设计

开发一个功能完备且高效的外卖系统,需要选择合适的技术栈并设计良好的系统架构。本文将详细介绍外卖系统开发过程中常用的技术栈以及架构设计的关键要点,帮助开发者构建一个高性能、可扩展且易维护的外卖平台。 1. 技术栈选择 选择合适的技术栈是开发…

基于51单片机智能蓝牙台灯

基于51单片机智能蓝牙台灯 (仿真+程序+原理图PCB) 功能介绍 具体功能: 1.分为手动/自动两种模式,自动模式下对应LED指示灯亮; 2.手动模式下,可用按键调节亮度; 3.自动…

OLED写入指令和数据

1.OLED写命令 写命令/数据的代码 / * 1. start() 2. 写入 b0111 1000 0x78 3. ACK 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据 5. ACK 6. 写入指令/数据 7. ACK 8. STOP */ void Oled_Write_Cmd(char dataCmd)5.1.4 OLED的寻址模式 如何显示一个点&#x…

NTLite深度Windows系统镜像文件修改定制

计算机爱好者和技术宅的圈子里,NTLite是一个广受欢迎的名字,一款强大的Windows系统定制工具,允许用户对Windows安装镜像进行深度修改,从而打造出一个更加个性化、高效且精简的操作系统。无论是为了优化系统性能、移除不必要的组件,还是集成最新的更新和驱动,NTLite都能成…

Mac在docker可视化界面上安装主流数据库

前言 篇幅有点长,大家可以打开目录快速跳转到想要的数据库即可! 虽然说用命令行会显得我们更加专业一些,但对于我英语水平不怎么好的人来说,毕竟命令多又长,还不好记。我个人是喜欢复杂问题简单化,踩了很多…

如何使用 ArcGIS Pro 计算水库库容量

计算水库库容量可以在前期规划的时候协助水库的选址和预估水库的规模,这里为大家介绍一下在 ArcGIS Pro 中如何计算水库的库容量,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的DEM数据,除了DEM数据,常见…

JAVA 大鱼吃小鱼小游戏

java实现大鱼吃小鱼,支持身份证防沉迷、账号密码、选择难度 放沉迷 登录 选择难度 游戏界面

网易狼人杀 设置点击自动发言

我们玩网易狼人杀 刚开始 都会发现 要按住麦克风才能发言 不得不说 相当的麻烦 我们可以点击如下图 右上角这个设置的齿轮 新弹出的设置面板上 勾选这个点击发言 然后 我们只需要 点一下 就可以进入发言状态 然后 再点一下即可停止发言 会方便非常多

数字孪生智慧车站:全方位可视化管理平台

运用图扑数字孪生技术,智慧车站可视化管理平台实时模拟并监控车站运行状态,通过整合即时数据与历史数据,提供精准分析和预测。该平台支持乘客流量管理、设备运行监控、安全预警等多项功能,提高车站运营效率与安全性。直观的可视化…

docker-compose jira、bugzilla

一、jira 同这篇文章: linux docker 部署破解版本jira:8.4.0——测试体验(非商用)_jira docker-CSDN博客 直到构建完破解版本的镜像就可以了~ 二、bugzilla 1. 拉取镜像: 官网镜像搜索bugzilla,第一个就是: 直接…

输入与输出的魔法:探索Python的内置函数

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、从键盘捕获输入:input()函数的力量 二、打印输出:print()函数的…

【Postman接口测试】第三节.第二节.Postman界面功能介绍(下)

文章目录 前言四、Postman 基础功能介绍 4.4 批量执行接口请求 4.5 日志调试 4.6 Postman 断言 4.7 Postman 变量(全局/集合/环境) 4.7.1 定义变量 4.7.2 获取变量 4.8 请求前置脚本 4.9 接口自动关…

MyBatisPlus的简单入门

文章目录 1.MybatisPlus的简介2.创建SpringBoot工程3.编写测试类 1.MybatisPlus的简介 MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在:简化开发、提高效率。 它对应的官方网址:链接 2.创建Sprin…

window自动启动bat文件

开机自动开启远程桌面, WinR 执行netplwiz 命令进入设置;取消勾选,可选择所需用户,点击应用,输入远程的密码即可 开机自动开启远程桌面, WinR 执行netplwiz 命令进入设置;取消勾选&#xff0…

AppScan/哥斯拉的字体大小显示异常

搜索关键字:缩放、分辨率、高DPI 问题现象 其他软件的菜单字体显示异常,解决版办法也一样 哥斯拉 godzilla没有URL 解决办法 第一步: 在桌面软件快捷方式的图标上按鼠标右键,在弹出的对话框中选择【属性】,进入到属…

synchronized 锁的到底是什么?

通过8种情况演示锁运行案例,看看我们到底锁的是什么 1锁相关的8种案例演示code package com.bilibili.juc.lock;import java.util.concurrent.TimeUnit;/*** 题目:谈谈你对多线程锁的理解,8锁案例说明* 口诀:线程 操作 资源类* 8…

产教协同|暴雨AI算力赋能传媒实践教学

近日,“第七届传媒实践教学创新研讨会暨中国高校影视学会实验教学专业委员会年会”在美丽的山城重庆成功举办。本次大会以“拥抱AI,融合共生”为主题,吸引了来自全国200多所高校、30多家企业以及700多位大视听实践教学产学研用各界专家、学者…

【Kotlin】简单介绍与使用kotlin

🍎个人博客:个人主页 🏆个人专栏:Kotlin ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 特点 变量和常量 数据类型和类型推断 函数 字符串模板 条件表达式 空安全 when 表达式 循环 我的其他博客 前言 Kotlin是…

I2C协议详解

文章目录 概念工作模式 原理工作原理工作流程IIC协议的关键特点IIC通信过程 优点与缺点优点缺点 概念 IIC(Inter-Integrated Circuit)协议,也常被称为TWI(Two-Wire Interface)协议,是一种用于短距离通信的…