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

news2024/9/25 8:48:03

准备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.0
    return ['msvcr100']

后添加

elif msc_ver == '1927':
    # MinGW64 with gcc 8.3.0
    return ['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.coloradmin.cn/o/2163086.html

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

相关文章

路政通 | OPENAIGC开发者大赛高校组AI创新之星奖

在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给…

Vue+Tui-image-editor实现图片编辑(涂鸦,裁剪,标注,旋转,滤镜)

目录 前言 效果展示 涂鸦 裁剪 标注 旋转 滤镜 安装 使用 中文化自定义样式按钮优化 参考链接 前言 需求:对图片进行旋转、缩放、裁剪、涂鸦、标注、添加文本等。 效果展示 涂鸦 裁剪 标注 旋转 滤镜 安装 npm i tui-image-editor // or yarn add tui-image…

【hot100-java】【环形链表 II】

印象题 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {public ListNode detectCycle(ListNode head) {ListNode fasthea…

①无需编程 独立通道 Modbus主站EtherNet/IP转ModbusRTU/ASCII工业EIP网关串口服务器

Modbus主站EtherNet/IP转ModbusRTU/ASCII工业EIP网关串口服务器https://item.taobao.com/item.htm?ftt&id743840591638 EtherNet/IP 串口网关 EtherNet/IP 转 RS485 型号 2路总线EIP网关 MS-A1-2021 4路总线EIP网关 MS-A1-2041 4路总线EIP网关(双网口&am…

NASA数据集:ATLAS/ICESat-2 L3 A海冰干岸,版本6

目录 ATLAS/ICESat-2 L3 A海冰干岸,版本6 简介 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATLAS/ICESat-2 L3 A海冰干岸,版本6 简介 ICESat-2天文台利用光计数激光雷达(ATLAS仪器)和辅助系统(GPS、…

速通LLaMA3:《The Llama 3 Herd of Models》全文解读

文章目录 概览论文开篇IntroductionGeneral OverviewPre-TrainingPre-Training DataModel ArchitectureInfrastructure, Scaling, and EfficiencyTraining Recipe Post-TrainingResultsVision ExperimentsSpeech Experiments⭐Related WorkConclusionLlama 3 模型中的数学原理1…

mybatisplus介绍以及使用(下)

目录 一、mybatisplus扩展功能 1、代码生成 1.1 安装插件 1.2 使用 2、逻辑删除 二、插件功能 1、分页插件 2、示例 写在前面: 在上篇的mybatisplus中介绍到了其概念,其中包括了什么是mybatisplus以及已经有了mybatis但是我们为什么使用它&#x…

【MySQL内置数据库】information_schema

MySQL8.0.37 统计 1 ADMINISTRABLE_ROLE_AUTHORIZATIONS 2 APPLICABLE_ROLES 3 CHARACTER_SETS 提供了关于可用字符集的信息 4 CHECK_CONSTRAINTS 5 COLLATIONS 提供了关于字符集的排序规则的信息 6 COLLATION_CHARACTER_SET_APPLICABILITY 7 COLUMNS …

基于JAVA+SpringBoot+Vue的医院后台管理系统

基于JAVASpringBootVue的医院后台管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈…

Redis 消息队列

认识消息队列 消息队列(Message Queue)字面意思就是存放消息的队列,最简单的消息队列模型包括 3 个角色 消息队列:存储和管理消息,也被称为消息代理(Message Broker) 生产者:发送消…

游戏开发2025年最新版——八股文面试题(unity,虚幻,cocos都适用)

1.静态合批与动态合批的原理是什么?有什么限制条件?为什么?对CPU和GPU产生的影响分别是什么? 原理:Unity运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们,就是一个drawcall批次。 限…

【day20240925】常见数据集科普

文章目录 常见数据集Fashion-MNISTCIFAR-10CIFAR-100IMDbTiny Imagenet 常见数据集 Fashion-MNIST CIFAR-10 CIFAR-100 IMDb Tiny-ImageNet Fashion-MNIST Fashion-MNIST数据集涵盖了来自 10 种类别的共 7 万个不同商品的正面图片。它的大小、格式和训练集 / 测试集划分与原…

pycharm 使用 translation 插件通过openai进行翻译

pycharm 使用 translation 插件通过openai进行翻译 1. 安装插件2. 配置插件3. 翻译 1. 安装插件 2. 配置插件 3. 翻译 调用 openai 时使用的提示词如下&#xff1a; <|im_start|>system\nYou are a translation engine that can only translate text and cannot interpr…

WebSocket实现在线聊天室

项目实现源码&#xff1a; 前端源码 后端源码 1.常见的消息推送方式 1.1 轮询 1.1.1 轮询的概念 客户端以固定的事件间隔&#xff08;例如每秒或几分钟&#xff09;向服务器发送HTTP请求&#xff0c;服务器收到请求后&#xff0c;处理请求并返回数据给客户端 轮询具体实现htt…

Redis的一些数据类型(一)

&#xff08;一&#xff09;数据类型 我们说redis是key value键值对的方式存储数据&#xff0c;key是字符串&#xff0c;而value是一些数据结构,那今天就来说一下value存储的数据。 我们数据结构包含&#xff0c;String&#xff0c;hash&#xff0c;list&#xff0c;set和zest但…

SegFormer网络结构的学习和重构

因为太多的博客并没有深入理解,本文是自己学习后加入自己深入理解的总结记录&#xff0c;方便自己以后查看。 segformer中encoder、decoder的详解。 学习前言 一起来学习Segformer的原理,如果有用的话&#xff0c;请记得点赞关注哦。 一、Segformer的网络结构图 网络结构&…

反转字符串 II--力扣541

反转字符串 II 题目思路代码 题目 思路 本题的关键在于理解每隔 2k 个字符的前 k 个字符进行反转&#xff0c;剩余字符小于 2k 但大于或等于 k 个&#xff0c;则反转前 k 个字符。并且剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。 让i每次跳2k&#xff0c;成为每一次…

Xshell 连接 VMware虚拟机操作 截图和使用

Xshell 连接 VMware虚拟机操作 文章目录 Xshell 连接 VMware虚拟机操作一、本机环境截图1.1配置 Xshell环境截图VWware 配置环境截图最后下载地址 一、本机环境截图 1.1配置 Xshell环境截图 VWware 配置环境截图 最后 下载地址 vmware https://www.vmware.com/ VMware总部位于…

电场(electric-field)

图中&#xff1a; Q 产生电场的正电荷&#xff08;可正可负&#xff0c;这里用正举例&#xff09;q 试验电荷&#xff0c;正电荷&#xff08;习惯上用正电荷&#xff09;p 试验电荷所在的位置&#xff08;即要测的电场强度的位置&#xff09;r 为电荷间的距离 r ^ \widehat{r}…

广州电影产业博览交易会将于本周五开始

“影动广州绽放世界”广州电影产业博览交易会由广州市人民政府主办&#xff0c;广州市委宣传部承办&#xff0c;将在广交会展馆A区4.2及5.2馆启幕。本届广州影博会聚焦电影产业交易、科技创新和消费市场&#xff0c;链接国内外电影资源&#xff0c;活动内容丰富。设置电影主题展…