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

这篇具有很好参考价值的文章主要介绍了【Python小技巧】加密又提速,把.py文件编译为.pyd文件(类似dll函数库),你值得拥有!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言


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/
下载生成工具,并在线安装。
pyd文件,python,开发语言,microsoft

pyd文件,python,开发语言,microsoft
pyd文件,python,开发语言,microsoft
pyd文件,python,开发语言,microsoft
安装完成推出即可。

三、编译.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文件。

pyd文件,python,开发语言,microsoft

注意:如果出现如下提示,则表示您的编译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导入。
pyd文件,python,开发语言,microsoft
我们编辑一个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版本的,可安装虚拟环境重复以上编译过程即可生成多个版本,方便不同环境下调用。文章来源地址https://www.toymoban.com/news/detail-739600.html

到了这里,关于【Python小技巧】加密又提速,把.py文件编译为.pyd文件(类似dll函数库),你值得拥有!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [技术杂谈]如何查看DLL文件或者pyd文件依赖的DLL

    去网站:http://www.dependencywalker.com/ 下载程序后,file打开对应的dll或者pyd即可 Dependency Walker是一个免费的实用程序,可以扫描任何32位或64位的Windows模块(exe, dll, ocx, sys等),并构建所有依赖模块的分层树图。对于找到的每个模块,它列出该模块导出的所有函数,以及其他模块实

    2024年02月07日
    浏览(35)
  • python中一些代码提速技巧

    列表是一个有序的可重复元素的集合,它可以包含任意类型的对象。列表的实现通常使用动态数组,这意味着可以通过索引来快速访问元素。 集合是一个无序的不重复元素的集合,它只能包含可散列的对象(例如,数字、字符串等)。集合的实现通常使用哈希表或类似的数据

    2024年02月07日
    浏览(25)
  • python隐藏源码,生成pyd文件并调用的完整过程

    我们知道​ ​windows 系统有许多 DLL 后缀的文件,即动态链接库,在运行时链接到调用程序​​。在运行时链接到 DLL 之类的库的主要优点是,它可以促进代码重用,模块化体系结构和更快的程序启动。结果,DLL 在 Windows 操作系统周围提供了许多功能。​​pyd 这个 d 就是取自

    2024年02月04日
    浏览(38)
  • PE文件反编译为python脚本流程

    DetectltEasy、PeiD查壳 常见打包工具PyInstaller,脱壳方法 (1)用pyinstxtractor.py脱壳,用”python pyinstxtractor.py 1.exe“命令,生成“.exe文件名_extracted” (2)用pyinstaller脱壳,之后可用pyi-archive_viewer +exe文件名查看 exe 内部的文件结构 下载:pip install pyinstaller 使用:pyinstaller 1.exe、

    2023年04月25日
    浏览(26)
  • 【Python】九十条简单py技巧打包(仅此一次哦)

    九十条python实用技巧大总结,现在就开始咯! 建议1:理解 Pythonic 概念—-详见 Python 中的《Python之禅》 建议2:编写 Pythonic 代码 (1)避免不规范代码,比如只用大小写区分变量、使用容易混淆的变量名、害怕过长变量名等。有时候长的变量名会使代码更加具有可读性。 (

    2023年04月08日
    浏览(20)
  • Win10系统提速技巧 教你快速提速

           Win10 系统如何快速提速 ? 下面整理一些 Win10 系统提速技巧内容流程,希望能帮助到大家 ! 1 、在 Win10 桌面上,鼠标右键点击“此电脑”图标,在点击图中所示的“属性”菜单。     2 、接着在出现的界面,点击“高级系统设置”。   3 、在下图所示的界面,性能中点

    2023年04月08日
    浏览(27)
  • pycharm引用pyd文件

    接上文:python文件打包成pyd文件 打包后的pyd文件名比较长,我们改成Demo.pyd. 1. 新建python project 2. 拷贝Demo.pyd文件到工程根目录 3. 在需要用到的py文件比如main.py文件引用即可 DemoFun假设为你要用的类。 这样即可使用了,Run main.py请观察输出, pyd依赖的package要确保安装完全, 打

    2024年02月16日
    浏览(20)
  • python头部信息、py头部信息、python头信息、py头信息、py文件头部

    Python py文件头部可指定以下信息: 1. 文件编码: # -*- coding: utf-8 -*- (指定文件的字符编码,通常为UTF-8。) 示例: # -*- coding: utf-8 -*- # -*- coding: utf-8 -*- 是在Python源代码文件的开头添加的注释,用于指定整个源代码文件的编码格式为UTF-8。这种注释通常被称为文件编码声明(

    2024年02月16日
    浏览(29)
  • python如何在一个py文件中调用另一个py文件中的方法

    要在一个Python文件中调用其他Python文件中的方法,可以使用Python的模块导入功能。模块是一个包含Python定义和语句的文件,可以被其他Python程序导入和使用。 假设我们有两个Python文件,一个是file1.py,另一个是file2.py。如果我们想在file1.py中调用file2.py中的方法,我们可以按照

    2024年02月11日
    浏览(28)
  • python-基础篇-文件-py脚本

    报以上错误,需要在根目录下创建test文件夹

    2024年01月25日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包