将python代码文件转成Cython 编译问题集

准备setup.py

from distutils.core import setup
from Cython.Build import cythonize
import glob# 指定目标目录 python setup.py build -c mingw32
target_dir = "src"# 使用glob模块匹配目录中的所有.pyx文件
pyx_files = glob.glob(target_dir + "/**/*.py", recursive=True)
print(f"pyx_files={pyx_files}")
# 将匹配到的所有.pyx文件进行编译
setup(ext_modules=cythonize(pyx_files, language_level=3))

运行命令:

python setup.py build -c mingw32

不出意外就会将src目录的文件全部编译城.c文件。出意外就看下面的错误集↓↓↓

-----------

众所周知,很多Python的库都需要编译(可能是用了Cython),这时直接用pip安装会报错:error: Microsoft Visual C++ 14.0 is required.

不知为何,我的电脑死活不能安装上VC,只能用mingw作为编译器。

附:MinGW-w64 密码:2jfy,tdm64-gcc tdm-gcc(32位)

最新版:tdm-gcc GCC with the MCF thread model MinGW-w64

环境变量:[Windows配置MinGW环境变量]

然后编辑你的 Python 路径/Lib/distutils/distutils.cfg 或者 %USERPROFILE%\pydistutils.cfg

[build]
compiler=mingw32
[build_ext]
compiler = mingw32# To solve the gcc error of "error: enumerator value for '__pyx_check_sizeof_voidp' is not an integer constant"
# if you have a mingw for 64bit then
# refer to https://docs.python.org/zh-cn/3/distutils/configfile.html
# you can also refer to https://github.com/cython/cython/issues/3405#issuecomment-596975159
define = MS_WIN64 

仍然会报错 Unknown MS Compiler version XXXX

编辑你的Python路径/Lib/distutils/cygwinccompiler.py

elif msc_ver == '1600':# VS2010 / MSVC 10.0return ['msvcr100']

后添加

elif msc_ver == '1927':# MinGW64 with gcc 8.3.0return ['msvcr120'] # seem to be a dynamic-linker program name for command `ld`

其中1927改为你的Compiler version

----------------------

然后编译又报错:

error: enumerator value for '__pyx_check_sizeof_voidp' is not an integer constant

解决办法:

您可以简单地将此补丁应用于%PYTHON_DIR%\include\pyconfig.h

--- pyconfig.h	2016-01-27 10:54:56.000000000 +0300
+++ pyconfig.h	2016-03-28 11:46:48.000000000 +0300
@@ -100,6 +100,12 @@/* Compiler specific defines */+#ifdef __MINGW32__
+#ifdef _WIN64
+#define MS_WIN64
+#endif
+#endif
+/* ------------------------------------------------------------------------*//* Microsoft C defines _MSC_VER */#ifdef _MSC_VER
# --inplace 将放在原地
# 指定目标目录 python setup.py build_ext  -c mingw32

setup.py完整如下:

import os
from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension
import glob# 获取当前脚本所在目录
current_dir = os.path.dirname(os.path.abspath(__file__))# 指定源代码目录
source_dir = os.path.join(current_dir, "src")# 使用glob模块匹配目录中的所有.pyx文件
pyx_files = glob.glob(os.path.join(source_dir, "**/*.py"), recursive=True)# 保持相对路径
relative_pyx_files = [os.path.relpath(pyx, current_dir) for pyx in pyx_files]
print(f"pyx_files={relative_pyx_files}")# 指定目标目录
target_dir = os.path.join(current_dir, "build")# 将匹配到的所有.pyx文件进行编译
extensions = [Extension(os.path.splitext(pyx)[0].replace(os.sep, '.'), [pyx]) for pyx in relative_pyx_files]setup(ext_modules=cythonize(extensions, language_level=3),script_args=['build_ext', '--build-temp', target_dir, '-c', 'mingw32'],
)

通过执行python setup.py 就会将当前py文件转成pyd

-----------------

在Python开发中,我们经常需要保护我们的代码不被轻易查看或修改。同时,我们也希望提高代码的执行效率。将Python文件编译为.pyd动态链接库是一种可以实现这两点的有效方法。.pyd文件类似于Windows平台上的.dll文件,是一种动态链接库,包含了编译后的二进制代码。通过这种方式,我们可以隐藏源代码,同时利用编译的优势提高代码的执行效率。
要实现这一目标,我们需要使用Cython工具。Cython是一个Python到C的编译器,可以将Python代码转换为C代码,然后编译成.pyd文件。
下面是一个简单的步骤指南:

  1. 安装Cython:首先,你需要在你的开发环境中安装Cython。可以通过pip安装,命令如下:
     
    1. pip install cython
  2. 创建Cython文件:创建一个新的Python文件,后缀名为.pyx。这个文件将包含你要编译的Python代码。例如,你可以创建一个名为example.pyx的文件,其中包含以下内容:
     
    1. def say_hello(name):
    2. print(f'Hello, {name}!')
  3. 编写setup.py:接下来,你需要创建一个setup.py文件,用于配置编译过程。以下是一个简单的setup.py示例:
     
    1. from setuptools import setup
    2. from Cython.Build import cythonize
    3. setup(
    4. ext_modules = cythonize('example.pyx')
    5. )
  4. 编译为C文件:在命令行中进入包含setup.py和example.pyx的目录,然后运行以下命令:
     
    1. pip install -e . # 或者 python setup.py build_ext --inplace
    这将会生成一个名为example.c的C源文件和一个名为example.so(Linux/macOS)或example.pyd(Windows)的共享库文件。请注意,生成的共享库文件名可能因平台而异。在Windows上,你需要将example.so改为example.pyd。
  5. 使用编译后的模块:现在你可以像普通Python模块一样导入并使用你的.pyd文件了。例如:
     
    1. import example
    2. example.say_hello('World') # 输出:Hello, World!
    通过以上步骤,你就可以将Python代码编译为.pyd动态链接库,实现代码的加密和加速。编译后的代码不仅更加安全,而且执行效率更高。这对于需要保护核心算法或希望提高程序性能的项目来说非常有用。当然,Cython还提供了更多高级功能,如类型检查和C API集成,可以根据需要进行探索和使用。

参考:将Python文件编译为.pyd动态链接库:加密与加速的完美结合

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

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

相关文章

基于STM32F103C8T6单片机的农业环境监测系统设计

本设计是基于STM32F103C8T6单片机的农业环境监测系统,能够完成对作物的生长环境进行信息监测和异常报警,并通过手机APP来实现查看信息和设定阈值的功能。为了实现设计的功能,该系统应该有以下模块:包括STM32单片机模块、水环境PH值…

STM32基础学习笔记-ADC面试基础题6

第六章、ADC 常见问题 1、基本概念:什么是ADC ?作用 ?逐次逼近型 2、传感器本质 ?传感器、电压、ADC数值转化 ? 3、ADC的特征 ? 转化时间、分辨率、精度、量化误差 ? 4、ADC框图组成部分 &…

如何安全有效地进行Temu自养号测评,提升账号权重防关联

在当今市场环境中,许多现成的系统或软件包往往缺乏全面的风险控制能力。掌握自养号测评技术,确保在运营过程中减少对外部系统的依赖。以下是搭建安全、高效运营环境的详细指导,特别针对手机端与电脑端环境的设置,以及关键资源的获…

计算机毕业设计Hadoop+Spark知识图谱体育赛事推荐系统 体育赛事热度预测系统 体育赛事数据分析 体育赛事可视化 体育赛事大数据 大数据毕设

《HadoopSpark知识图谱体育赛事推荐系统》开题报告 一、研究背景及意义 随着互联网技术的迅猛发展和大数据时代的到来,体育赛事数据的数量呈爆炸式增长。用户面对海量的体育赛事信息,常常感到信息过载,难以快速找到感兴趣的赛事内容。如何高…

虚拟机屏幕分辨率自适应VMWare窗口大小

文章目录 环境问题解决办法其它虚拟机和主机间复制粘贴 参考 环境 Windows 11 家庭中文版VMWare Workstation 17 ProUbuntu 24.04.1 问题 虚拟机的屏幕大小,是固定的。如下图,设置的分辨率是800*600,效果如下: 可见&#xff0c…

【PyTorch】数据读取和处理

数据读取机制DataLoader与Dataset 数据处理过程 DataLoader torch.utils.data.DataLoader 功能:构建可迭代的数据装载器 dataset:Dataset类,决定数据从哪里读取及如何读取batchsize:批大小num_works:是否多进程读取…

jvm专题 之 内存模型

文章目录 前言一个java对象的运行过程jvm内存分布程序的基本运行程序什么是对象?对象与类的关系?由类创建对象的顺序 前言 一个程序需要运行,需要在内存中开辟一块空间类是构建对象的模板,只有类加载到内存中才能创建对象 一个j…

Python神经求解器去耦合算法和瓦瑟斯坦距离量化评估

🎯要点 神经求解器求解对偶方程,并学习两个空间之间的单调变换,最小化它们之间的瓦瑟斯坦距离。使用概率密度函数解析计算,神经求解器去耦合条件正则化流使用变量变换公式的生成模型瓦瑟斯坦距离量化评估神经求解器 &#x1f36…

SqlSugar的where条件中使用可空类型报语法错误

SQLServer数据表中有两列可空列,均为数值类型,同时在数据库中录入测试数据,Age和Height列均部分有值。   使用SqlSugar的DbFirst功能生成数据库表类,其中Age、Height属性均为可空类型。   当Where函数中的检索条件较多时&a…

针对国产化--离线安装Nginx rpm包下载 ARM64(.aarch64.rpm) 版本下载

源地址:https://nginx.org/packages/centos/7/aarch64/RPMS/ 可以选择系统分别进行下载对应的rmp包

Unity 设计模式 之 行为型模式 -【中介者模式】【迭代器模式】【解释器模式】

Unity 设计模式 之 行为型模式 -【中介者模式】【迭代器模式】【解释器模式】 目录 Unity 设计模式 之 行为型模式 -【中介者模式】【迭代器模式】【解释器模式】 一、简单介绍 二、中介者模式(Mediator Pattern) 1、什么时候使用中介者模式 2、使用…

记一次sql查询优化

记一次sql查询优化 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 今天测试环境发现一个问题,就是测试同事在测试的时候,发现cpu一直居高不下,然…

SDK(2 note)

复习上一次内容&#xff1a; 把前一次笔记中的代码&#xff0c;简写一下 #include <windows.h> #include<tchar.h> #include <stdio.h> #include <strsafe.h> VOID showerrormassage() {LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFF…

【春秋云境】CVE-2024-23897-Jenkins 2.441之前版本存在任意文件读取漏洞

一、靶场介绍 Jenkins 2.441及更早版本&#xff0c;以及LTS 2.426.2及更早版本没有禁用其CLI命令解析器的一个功能&#xff0c;该功能会将参数中’字符后跟的文件路径替换为该文件的内容&#xff0c;允许未经身份验证的攻击者读取Jenkins控制器文件系统上的任意文件。 二、P…

SSM+Vue共享单车管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作…

js中Fucntion的意义

在js中&#xff0c;我们常常如下方式写函数&#xff1a; function fn(){console.log("这是一个函数."); }; fn(); 在js中&#xff0c;函数本质就是一个对象。 那么&#xff0c;结合我的上一篇文章&#xff1a;通俗讲解javascript的实例对象、原型对象和构造函数以及…

谷歌浏览器如何更改下载文件存放的方式及其路径?

1、点击谷歌浏览器右上角的【三个点】 2、选择【设置】&#xff0c;再选择【下载内容】 3、打开【下载完成后显示下载内容】开关&#xff0c; 则&#xff1a;下载网页上的东西之后&#xff0c;会显示在【谷歌浏览器】的右侧&#xff0c;并显示具体下载文件在右侧&#xff1a;…

探索OpenAI的全新里程碑:o1模型

近期&#xff0c;人工智能领域迎来了一项重要突破——OpenAI发布了其最新的语言模型o1。作为一款专为解决复杂问题设计的新一代大语言模型&#xff08;LLM&#xff09;&#xff0c;o1标志着该公司在智能推理能力方面迈出了重要的一步。尽管这个新系统仍处于初步阶段&#xff0c…

系统架构师-面向服务架构(SOA)全解

1、为什么需要SOA架构 1.1 系统集成问题 异构系统整合 例如&#xff0c;一个企业可能同时拥有用 Java 开发的企业资源规划&#xff08;ERP&#xff09;系统、用 C# 开发的客户关系管理&#xff08;CRM&#xff09;系统以及用 Python 开发的数据分析系统。通过 SOA&#xff0…

WebRTC中的维纳滤波器实现详解:基于决策导向的SNR估计

目录 1. 维纳滤波器的基本原理2. WebRTC中的维纳滤波器实现3. 代码逐步剖析4. 总结 在WebRTC的噪声抑制模块中&#xff0c;维纳滤波器&#xff08;Wiener Filter&#xff09;是一种非常常见且重要的滤波器&#xff0c;用于提高语音信号的清晰度并抑制背景噪声。本文将详细解释维…