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

2024-05-29 21:20
文章标签 编译 py pyd cython

本文主要是介绍利用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 文件。

这篇关于利用cython将.py文件编译为.pyd文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1014677

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

Golang test编译使用

创建文件my_test.go package testsimport "testing"func TestMy(t *testing.T) {t.Log("TestMy")} 通常用法: $ go test -v -run TestMy my_test.go=== RUN TestMyTestMy: my_test.go:6: TestMy--- PASS: TestMy (0.

UMI复现代码运行逻辑全流程(一)——eval_real.py(尚在更新)

一、文件夹功能解析 全文件夹如下 其中,核心文件作用为: diffusion_policy:扩散策略核心文件夹,包含了众多模型及基础库 example:标定及配置文件 scripts/scripts_real:测试脚本文件,区别在于前者倾向于单体运行,后者为整体运行 scripts_slam_pipeline:orb_slam3运行全部文件 umi:核心交互文件夹,作用在于构建真

LibSVM学习(六)——easy.py和grid.py的使用

我们在“LibSVM学习(一)”中,讲到libSVM有一个tools文件夹,里面包含有四个python文件,是用来对参数优选的。其中,常用到的是easy.py和grid.py两个文件。其实,网上也有相应的说明,但很不系统,下面结合本人的经验,对使用方法做个说明。        这两个文件都要用python(可以在http://www.python.org上下载到,需要安装)和绘图工具gnup

C++/《C/C++程序编译流程》

程序的基本流程如图:   1.预处理        预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。 读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理将所有的“#define”删除,并且展开所有的宏定义处理所有的条件编译指令,如:“#if”、“

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

QT 编译报错:C3861: ‘tr‘ identifier not found

问题: QT 编译报错:C3861: ‘tr’ identifier not found 原因 使用tr的地方所在的类没有继承自 QObject 类 或者在不在某一类中, 解决方案 就直接用类名引用 :QObject::tr( )

hector_quadrotor编译总结 | ubuntu 16.04 ros-kinetic版本

hector_quadrotor编译总结 | ubuntu 16.04 ros-kinetic版本 基于Ubuntu 16.04 LTS系统所用ROS版本为 Kinetic hector_quadrotor ROS包主要用于四旋翼无人机的建模、控制和仿真。 1.安装依赖库 所需系统及依赖库 Ubuntu 16.04|ros-kinetic|Gazebo|gazebo_ros_pkgs|ge