【Python小技巧】加密又提速,把.py文件编译为.pyd文件(类似dll函数库),你值得拥有!

news2024/11/28 2:36:20

文章目录

  • 前言
  • 一、常见的Python文件格式有哪些?
  • 二、准备编译环境
    • 1. 安装cython
    • 2. 安装Microsoft C++ 生成工具
  • 三、编译.py文件为.pyd文件
    • 1. 编辑原始.py文件
    • 2. 准备setup.py文件
    • 3. 进行编译
  • 四、测试
  • 总结


前言


Python的脚本文件是开源的,若直接发布,就等于开源。对于个人使用或则公开源码的,没有问题。但对于分发部署,就有些不妥了。一则开源任何人都可以修改,可能不安全;二则效率没有编译后的高。所以,需要保护源码,特别是公司的产品,就需要对Python代码进行混淆加密保护。

那么,如何编译和加密呢?下面,我们就来说一说。

一、常见的Python文件格式有哪些?

Python常见的文件类型介绍:
.py python的源代码文件,可以直接编辑,直接运行
.pyc Python源代码import后,编译生成的字节码
.pyd Python的动态链接库(Windows平台dll),需要通过其它程序调用运行。

这里,我们重点说第三种文件形式。

二、准备编译环境

要将.py文件转为.pyd文件,我们需要两个工具,一个是cython,一个是微软的C++ 生成工具。下面我们一步一步来安装。

1. 安装cython

通过pip install cython -i https://pypi.tuna.tsinghua.edu.cn/simple 安装cython

(base) C:\Users\Administrator>pip install cython -i https://pypi.tuna.tsinghua.edu.cn/simple
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting cython
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/d2/49/9845f14b6716614c832535b67e3b491434d7fdecf510fcb6fe254f60a974/Cython-0.29.34-py2.py3-none-any.whl (988 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 988.1/988.1 kB 10.5 MB/s eta 0:00:00
Installing collected packages: cython
Successfully installed cython-0.29.34

(base) C:\Users\Administrator>

2. 安装Microsoft C++ 生成工具

进入https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/
下载生成工具,并在线安装。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
安装完成推出即可。

三、编译.py文件为.pyd文件

1. 编辑原始.py文件

这里我们写一个计算平方的函数.py文件,将以下文件保存为my_func.py。
注:这里第3行添加 # cython: language_level=3,以表示在Python3环境进行编译。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# cython: language_level=3

def square(x):
    return int(x)**2

if __name__ == '__main__':
    print(square(6))

2. 准备setup.py文件

在同目录下编写setup.py文件,将my_func.py写到最后一行。如果有多个.py文件,以逗号为间隔全部写上,可一次性编译。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# here put the import lib
from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules=cythonize(["my_func.py"]))

3. 进行编译

通过cmd命令切换到文件所在目录,执行以下命令

python setup.py build_ext --inplace

步骤及结果如下:

(base) C:\Users\Administrator>cd pydtest
(base) C:\Users\Administrator\pydtest>python setup.py build_ext --inplace
Compiling my_func.py because it changed.
[1/1] Cythonizing my_func.py
my_func.c
  正在创建库 build\temp.win-amd64-cpython-310\Release\my_func.cp310-win_amd64.lib 和对象 build\temp.win-amd64-cpython-310\Release\my_func.cp310-win_amd64.exp
正在生成代码
已完成代码的生成

(base) C:\Users\Administrator\pydtest>

编译完成后生成my_fucn.cp310-win_amd64.pyd文件。正式发布使用时我们需要改回my_fucn.pyd才可以引用,将文件名中间“cp310-win_amd64”删除即可。且文件名称不可以修改成其它名字哦,否则会提示引用失败。

以上即整个pyd文件生成的方法。在python文件运行时将优先寻找调用.pyd文件。找不到会再寻找相对应的.py文件。

在这里插入图片描述

注意:如果出现如下提示,则表示您的编译Visual Studio编译环境未准备好。如果按步骤操作,应该不会出现。

(base) C:\Users\Administrator\pydtest>python setup.py build_ext --inplace
Compiling test.py because it changed.
[1/1] Cythonizing test.py
d:\ProgramData\anaconda3\lib\site-packages\Cython\Compiler\Main.py:369: FutureWarning: Cython directive ‘language_level’ not set, using 2 for now (Py2). This will change in a later release! File: C:\Users\Administrator\pydtest\test.py
tree = Parsing.p_module(s, pxd, full_module_name)
error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools”: https://visualstudio.microsoft.com/visual-cpp-build-tools/

四、测试

为了比较运行速度,我们分别引入对应函数,并计算他们的用时。这里,我们把原始的my_func.py文件放到了backup目录,后期使用backup.my_func导入。
在这里插入图片描述
我们编辑一个main.py,内容如下:
这里引入使用装饰器,方便测算函数运行时间。只需要在函数前面加上@timer即可。

# 引用原始的.py文件
from backup.my_func import square as square1
# 引用编译后的.pyd文件
from my_func import square as square2

# 装饰器(计算执行耗时)
def timer(func):
    import time
    def deco(*args, **kwargs):  
        start = time.time()
        res = func(*args, **kwargs)
        stop = time.time()
        print(''.join([func.__name__,' 耗时:',str(stop-start)]))
        return res 
    return deco

@timer
def cal_square1(x):
    total = 0
    for i in range(x):
        y = square1(i)
        total += y
    return y

@timer
def cal_square2(x):
    total = 0
    for i in range(x):
        y = square2(i)
        total += y
    return y

if __name__ == '__main__':
    x = 10000000
    print('使用py文件计算:平方累计=',cal_square1(x))
    print('使用pyd文件计算,平方累计=',cal_square2(x))

同样的函数内容,同样的计算结果,结果如下:

cal_square1 耗时:5.30519700050354
使用py文件计算:平方累计= 99999980000001
cal_square2 耗时:4.141402721405029
使用pyd文件计算,平方累计= 99999980000001
请按任意键继续. . .

经测试,可以发现,经过编译的函数,耗时明显减少了。

注意:如果运行出现如下提示,则检查以下你修改后的文件名。比如我编译为my_func.pyd,但改问你my_func_new.pyd,虽然引用路径没问题,但依然会报错:

Traceback (most recent call last):
  File "C:\Users\Administrator\pydtest\main.py", line 2, in <module>
    from my_func_new import square as square2
ImportError: dynamic module does not define module export function (PyInit_my_func_new)
请按任意键继续. . .

总结

注意:这里还有个版本问题,刚才编译生成的my_fucn.cp310-win_amd64.pyd文件,即表示python3.10 win 64位操作系统环境。

在调用时也需要注意Python版本问题,调用环境要和编译的Python环境版本一致(如Python3.10编译,在Python3.10环境调用就行)。如果需要编译多个python版本的,可安装虚拟环境重复以上编译过程即可生成多个版本,方便不同环境下调用。

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

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

相关文章

i.MX RT1010跨界MCU上手体验(上)

由于项目需要性价比高一些的高性能MCU&#xff0c;了解到NXP的RT1010主频高达500MHZ的MCU&#xff0c;半个月以前已经拿到官方Demo板了&#xff0c;今天抽空上电体验下&#xff0c;在此记录。这颗芯片的优势是主频高&#xff0c;功能全&#xff0c;价格合理&#xff0c;但是需要…

第六章 方法区

文章目录 前言一、&#x1f6fa; 栈、堆、方法区的交互关系二、&#x1f68e; 方法区的理解1、方法区在哪里2、方法区的演变过程 三、&#x1f697; 设置方法区的大小与 OOM1、设置方法区内存的大小2、使用CGLib 让方法区OOM3、如何解决 OOM4、方法区的内部结构5、non-final 的…

利用提示工程优化软件架构:ChatGPT的应用

ChatGPT时代的软件架构全生命周期 简介 在如今日新月异的技术环境中&#xff0c;软件架构师必须不断地寻找和采纳新的工具和方法&#xff0c;以优化开发过程&#xff0c;提高效率&#xff0c;并保证最终产出的质量。其中&#xff0c;人工智能&#xff08;AI&#xff09;已经成…

《淘宝技术这十年》读书笔记

一. 分布式时代 在系统发展的过程中&#xff0c;架构师的眼光至关重要&#xff0c;作为程序员&#xff0c;只要把功能实现即可&#xff0c;但作为架构师&#xff0c;要考虑系统的扩展性、重用性&#xff0c;对于这种敏锐的感觉&#xff0c;有人说是一种“代码洁癖”。淘宝早期…

使用双屏时两个屏幕的色调、亮度不一样如何设置?

当使用双屏时&#xff0c;即使两个屏幕的型号一致也可能存在色差的问题&#xff08;色调不一致&#xff0c;亮度不一致&#xff09;&#xff0c;以下是解决此问题的方法。 Step1.同时按下两个屏幕下方的ok按钮 Step2.此时会进入显示器的OSD界面 Step3.通过按键切换菜单 Step4.…

节省35% MCU开发成本的红外智能洗手器运用方案,N9300-S16音乐芯片

随着全国人民生活水平的逐步提升以及近期疫情影响&#xff0c;公民的健康保护意识也越来越强&#xff0c;洗手液越来越被人们重视以及提倡&#xff0c;即时在受疫情影响是2022年洗手液市场规模也是上升至恐怖34亿元产值&#xff1b;而近年来自动感应洗手液器凭借实用性、便携性…

APP测试面试题快问快答(三)

11. App安装测试的主要内容有哪些&#xff1f; App是客户端程序&#xff0c;客户端程序就需要进行安装才能使用&#xff0c;因此需要测试安装、卸载、升级测试 关注点&#xff1a;正常场景、异常场景。 正常场景&#xff1a; 1. 在不同的操作系统上安装 2. 从不同的安装渠…

windows10安装ElasticSearch

一 安装 Java环境 ElasticSearch使用Java开发的&#xff0c;依赖Java环境&#xff0c;安装 ElasticSearch 之前&#xff0c;需要先安装一个较新版本的 Java&#xff0c;jdk 1.8版本太低了&#xff0c;需要安装jdk 11或更高版本。 Java安装方法请参考 Java 15环境安装 。 二 …

详解字典树原理,代码分析leetcode208. 实现 Trie (前缀树)

0、引言 本文介绍一种能够偶快速查找字符串的树形数据结构-----字典树。介绍其原理&#xff0c;以及通过leetcode208题目这个实例&#xff0c;用数组动手实现一棵字典树&#xff0c;并完成其增、查字符串、查字符串前缀的功能。 1、字典树的应用场景 询问一个单词b&#xff0c…

Mujoco 加载机器人模型(三)

目录 .1 简介 1.1 urdf概述 ​编辑 1.2 导出urdf为可用的xml​编辑 1.3 导出测试​编辑 .2 修改 2.1 添加平面和物体 2.2 关节修改 2.2.1 group 2.2.2 关节修改 2.2.3 关节 解压提供的ur5后 修改compiler的 meshdir路径 <mujoco model"ur5"><compi…

一条耗时100ms的SQL把系统搞崩了

一个项目上线了两个月&#xff0c;除了一些反馈的优化和小Bug之外&#xff0c;项目一切顺利。前期是属于推广阶段&#xff0c;可能使用人员没那么多&#xff0c;当然对于项目部署肯定提前想到并发量了&#xff0c;所以早就把集群安排上&#xff0c;而且还在测试环境搞了一下压测…

2023年的深度学习入门指南(15) - 大模型的幻觉

2023年的深度学习入门指南(15) - 大模型的幻觉 大模型的能力最另人惊讶的&#xff0c;一个是强大的能力&#xff0c;另一个就是时不时一本正经地胡说八道。如果你用的是小一点的模型&#xff0c;可能还见过输出循环内容之类的情况。我们将这种生成不良内容的现象称为幻觉-hall…

3d动画用云渲染靠谱吗?

3d动画是一种利用计算机技术制作的动画形式&#xff0c;它可以模拟真实世界的物体和场景&#xff0c;创造出各种惊人的效果和视觉体验。3d动画广泛应用于影视、游戏、广告、教育等领域&#xff0c;成为当今最流行的艺术表现形式之一。据统计&#xff0c;2019年全球3d动画市场规…

吴恩达老师《机器学习》课后习题1之线性回归

在学习这些内容之前&#xff0c;需要学习python数据分析相关内容&#xff1a; numpy&#xff1a;科学计算库&#xff0c;处理多维数组&#xff0c;进行数据分析 pandas&#xff1a;基于numpy的一种工具&#xff0c;该工具是为了解决数据分析任务而创建的 matplotlib&#xff1a…

Atcoder Beginner Contest 297

A - Double Click AC代码&#xff1a; #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N110; int t[N]; int main() {int n,d;cin>>n>>d;for(int i1;i<n;i) cin>>t[i];bool flagfalse;i…

数据结构05:树的定义与双亲表示法[持续更新中]

参考用书&#xff1a;王道考研《2024年 数据结构考研复习指导》 参考用书配套视频&#xff1a;5.1.1 树的定义和基本术语_哔哩哔哩_bilibili 特别感谢&#xff1a; Chat GPT老师[部分名词解释、修改BUG]、BING老师[封面图]~ 备注&#xff1a;博文目前是未完成的状态&#xff…

【数据结构】哈希表(Map和Set)

文章目录 Map和Set模型MapTreeMap和HashMap对比Entry<K,V>常用方法 SetTreeSet和HashSet对比常用方法 OJ练习只出现一次数字复制带随机指针的链表宝石与石头坏键盘打字前K个高频单词 哈希表哈希表所用数据结构解决哈希冲突闭散列开散列 避免哈希冲突哈希函数设计负载因子…

springboot bean的生命周期

Spring Boot是一个非常流行的Java框架&#xff0c;它提供了许多功能&#xff0c;使开发人员可以快速构建和部署应用程序。其中一个非常重要的功能是Spring Boot Bean的生命周期。在本文中&#xff0c;我们将深入探讨Spring Boot Bean的生命周期&#xff0c;以及如何最大化利用它…

光伏发电系统最大功率跟踪控制MATLAB仿真模型(电导增量法+扰动观察法)

光伏发电系统最大功率跟踪控制MATLAB仿真模型&#xff08;电导增量法扰动观察法参考文献&#xff09;资源-CSDN文库https://download.csdn.net/download/weixin_56691527/87878528 模型介绍&#xff1a; 模型主要包含光伏电池模块、直流升压模块、以及最大功率跟踪控制模块。…

深度学习--神经网络全面知识点总结(持续更新中)

文章目录 神经网络基础1.1 什么是神经网络&#xff1f;1.2 神经元和激活函数1.3 前向传播和反向传播1.4 损失函数和优化算法 深度神经网络2.1 卷积神经网络&#xff08;CNN&#xff09;2.2 循环神经网络&#xff08;RNN&#xff09;2.3 长短期记忆网络&#xff08;LSTM&#xf…