gcc配合cython编译python源代码

以前我们一般用Nuitka或者Pyinstaller来将python源码编译成二进制可执行文件。今天我们学习如何直接用gcc来编译。

很简单的一个python程序,结构如下。包含一个model.py和main.py
在这里插入图片描述

步骤1:处理main.py

处理main.py。即主程序入口

cython -D -2 --embed main.py
gcc -c -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -o main.o main.c
gcc -I/usr/include/python2.7 -o main main.o -lpython2.7

这三行命令用于将一个 Python 脚本 (main.py) 编译成一个可执行的 C 程序,使用了 Cython 工具。下面逐行解释每个命令的作用:

1. cython -D -2 --embed main.py

  • cython: Cython 是一个编译器,可以将 Python 代码转换为 C 代码,以提高性能。
  • -D: 这个选项启用调试信息,方便调试生成的 C 代码。
  • -2: 表示使用 Python 2 语法来编译。如果你的代码是用 Python 3 编写的,可以将其改为 -3
  • –embed: 这个选项指示 Cython 生成一个可以作为嵌入式 Python 解释器的 C 程序的主函数。生成的 main.c 文件将包含一个 main() 函数,使其可以直接运行。
  • main.py: 这是要编译的 Python 脚本的名称。

2. gcc -c -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -o main.o main.c

  • gcc: GNU C 编译器,用于编译 C 代码。
  • -c: 这个选项指示 GCC 只编译源文件,而不进行链接操作。它会生成一个目标文件(.o 文件)。
  • -fPIC: 生成位置无关代码(Position Independent Code),通常用于共享库。
  • -fwrapv: 使编译器在处理整数溢出时遵循 Python 的行为。
  • -O2: 启用优化级别 2,以提高生成代码的性能。
  • -Wall: 启用所有警告信息,帮助发现潜在问题。
  • -fno-strict-aliasing: 禁用严格别名规则,避免可能的未定义行为。
  • -I/usr/include/python2.7: 指定 Python 头文件的路径,以便编译器能够找到 Python 的 C API。
  • -o main.o: 指定生成的目标文件的名称为 main.o
  • main.c: 这是之前由 Cython 生成的 C 源文件。

3. gcc -I/usr/include/python2.7 -o main main.o -lpython2.7

  • gcc: 再次调用 GNU C 编译器。
  • -I/usr/include/python2.7: 同样指定 Python 头文件的路径,以便链接时找到 Python C API。
  • -o main: 指定生成的可执行文件的名称为 main
  • main.o: 指定要链接的目标文件。
  • -lpython2.7: 链接 Python 2.7 的共享库,使生成的可执行文件能够调用 Python 的函数和对象。

总结

这三行命令的整体作用是将一个 Python 脚本编译为一个 C 程序,并生成可执行文件 main。首先,使用 Cython 将 Python 代码转换为 C 代码,然后编译该 C 代码为目标文件,最后链接目标文件生成可执行程序。这样可以提高执行效率,并允许在 C 程序中嵌入 Python 解释器。

步骤2: 处理model.py

处理model.py。因为它不是程序的入口,所以我们将它编译成动态链接库

cython -D -2 model.py
gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -o model.so model.c

这两句命令用于将一个 Python 脚本 (model.py) 编译成一个共享库(.so 文件),使用 Cython 进行转换。下面逐句分析每个命令的作用:

1. cython -D -2 model.py

  • cython: Cython 是一个将 Python 代码转换为 C 代码的编译器,能够提高 Python 代码的执行效率。
  • -D: 启用调试信息,生成的 C 代码会包含调试符号,有助于调试。
  • -2: 指定使用 Python 2 的语法。如果您的代码是用 Python 3 编写的,可以将其改为 -3
  • model.py: 这是要编译的 Python 脚本的名称。运行此命令后,Cython 会生成一个名为 model.c 的 C 源文件。

2. gcc -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -o model.so model.c

  • gcc: GNU C 编译器,用于编译 C 代码。
  • -shared: 创建一个共享库,而不是一个可执行文件。这个选项会生成 .so 文件,允许其他程序使用这个库。
  • -pthread: 启用 POSIX 线程支持,允许在共享库中使用多线程功能。
  • -fPIC: 生成位置无关代码(Position Independent Code),适用于共享库的创建。
  • -fwrapv: 使编译器在处理整数溢出时遵循 Python 的行为。
  • -O2: 启用优化级别 2,以提高生成的代码性能。
  • -Wall: 启用所有警告信息,有助于发现潜在问题。
  • -fno-strict-aliasing: 禁用严格别名规则,以避免可能导致未定义行为的情况。
  • -I/usr/include/python2.7: 指定 Python 头文件的路径,以便编译器能够找到 Python 的 C API。
  • -o model.so: 指定生成的共享库的名称为 model.so
  • model.c: 这是由 Cython 生成的 C 源文件,包含了 model.py 的实现。

总结

这两句命令的整体作用是将一个 Python 脚本编译为一个共享库 (model.so),以便可以在其他 C/C++ 程序中调用其中的 Python 函数和对象。首先,使用 Cython 将 Python 代码转换为 C 代码,然后使用 GCC 编译该 C 代码生成共享库,提供给其他程序使用。

步骤3:验证

编译后的目录如下
在这里插入图片描述
其实现在我们只需要main和model.so这两个文件即可,效果如下。即现在已经不再需要依赖python源文件了。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BGP 路由反射器

转载:BGP 路由反射器 / 实验介绍: / 原理概述 缺省情况下,路由器从它的一个 IBGP 对等体那里接收到的路由条目不会被该路由器再传递给其他IBGP对等体,这个原则称为BGP水平分割 原则,该原则的根本作用是防止 AS 内部的 BGP 路由…

化学分子结构检测系统源码分享

化学分子结构检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

CleanClip For Mac 強大的剪貼簿助手Paste替代工具 v2.2.1

软件介绍: CleanClip是一款专为Mac设计的强大剪贴板管理工具,旨在提升用户的工作效率和生产力。这款应用完全采用原生Swift编写,为Mac用户提供了流畅、快速且直观的使用体验。CleanClip不仅支持文本内容的管理,还能处理图片、文件…

C++11——lambda

lambda lambda的介绍lambda的使用lambda的细节->捕捉列表 lambda的介绍 lambda是匿名函数,再适合的场景去使用可以提高代码的可读性。 场景: 假设有一个Goods类需要进行按照价格、数量排序 class Goods {string name;size_t _price;//价格int num;/…

攻击者将恶意软件分解成小块并绕过您的安全网关

近二十年来,安全 Web 网关 (SWG) 一直用于监控网络流量、拦截恶意文件和网站以及保护企业免受 Web 威胁。 如今,许多企业都相信他们的 SWG 能够捕获所有已知恶意软件,正如其 SLA (服务质量保证)中所承诺的那样。 然而…

Docker 里面按照ifconfig

1. 进入Docker 容器内部 docker exec -it xxx bash2. 安装 net-tools iputils-ping apt-get update && apt-get install -y net-tools apt-get update && apt-get install -y iputils-ping 3. 执行ifconfig 执行ping

WebLogic 后台弱⼝令GetShell

漏洞描述 通过弱⼝令进⼊后台界⾯ , 上传部署war包 , getshell 影响范围 全版本(前提后台存在弱⼝令) 环境搭建 cd vulhub-master/weblogic/weak_password docker-compose up -d 漏洞复现 默认账号密码:weblogic/Oracle123 weblogic…

ChatCADChatCAD+:Towards a Universal and Reliable Interactive CAD using LLMs

ChatCAD(论文链接:[2302.07257] ChatCAD: Interactive Computer-Aided Diagnosis on Medical Image using Large Language Models (arxiv.org)) 网络流程图: 辅助阅读: 基于大型语言模型的医学图像交互式计算机辅助诊…

数据结构--双链表

目录 一、引言 二 、链表的分类 1.单向或双向 2.带头或不带头 3.循环或不循环 三、双链表的概念与基本结构 1.概念 2.基本结构 三、双链表的常见操作 1.创建节点 2.初始化 3.头插 4.尾插 5.头删 6.尾删 7.打印 8.查找 9.插入节点 10.删除节点 11.销毁链…

gin配置swagger文档

一、基本准备工作 1、安装依赖包 go get -u github.com/swaggo/swag/cmd/swag go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files2、在根目录上配置swagger的路由文件 //2.初始化路由router : initialize.Routers()// 配置swaggerdocs.SwaggerInfo…

京东商品属性的详细api数据解析:颜色、尺寸与材质

京东(JD.com)作为一个大型电商平台,其商品信息通过API接口提供给开发者或第三方服务使用,以便进行商品搜索、展示、分析等操作。然而,直接访问京东的详细商品属性(如颜色、尺寸、材质等)API通常…

uniapp|微信小程序 实现输入四位数 空格隔开

<template><page-meta :page-style"cssVar"></page-meta><view class"container"><u-navbartitle"优惠券兑换"placeholderbgColor"#fff":autoBack"true":titleStyle"{fontFamily: SourceHa…

Maven Helper 插件

推荐指数&#xff1a;★★★★★ 分析依赖冲突插件 Maven Helper插件就可免去命令行困扰。通过界面解决依赖冲突。 点击此按钮&#xff0c;切换到此工具栏 可进行相应操作&#xff1a; Conflicts&#xff08;查看冲突&#xff09;All Dependencies as List&#xff08;列表形…

Java 在 GIS 领域的学习路线?

Java是一门广泛应用于企业级开发的编程语言&#xff0c;而GIS则是一种常用于地理信息处理和分析的技术。将Java与GIS结合起来&#xff0c;可以在企业级应用中实现更多的功能和业务需求&#xff0c;且在实际领域越来越广泛。 Java在GIS中重要的作用 1、跨平台性 Java具有跨平台…

鸿蒙HarmonyOS开发:一次开发,多端部署(界面级)天气应用案例

文章目录 一、布局简介二、典型布局场景三、侧边栏 SideBarContainer1、子组件2、属性3、事件 四、案例 天气应用1、UX设计2、实现分析3、主页整体实现4、具体代码 五、运行效果 一、布局简介 布局可以分为自适应布局和响应式布局&#xff0c;二者的介绍如下表所示。 名称简介…

搜索引擎onesearch3实现解释和升级到Elasticsearch v8系列(一)-概述

简介 此前的专栏介绍Onesearch1.0和2.0&#xff0c;详情参考4 参考资料&#xff0c;本文解释onesearch 3.0&#xff0c;从Elasticsearch6升级到Elasticsearch8代码实现 &#xff0c;Elasticsearch8 废弃了high rest client&#xff0c;使用新的ElasticsearchClient&#xff0c;…

uniapp 如何自定义导航栏并自适应机型

如今的移动设备有各种不同的屏幕形状&#xff0c;如刘海屏、水滴屏等。这些异形屏会影响页面的布局&#xff0c;尤其是导航栏和底部栏的显示。通过获取安全区域信息&#xff0c;可以确保页面内容不会被异形屏的特殊区域遮挡。 在设计页面顶部导航栏时&#xff0c;可以根据 saf…

模拟自然的本质:与IBM量子计算研究的问答

量子计算可能是计算领域的下一个重大突破&#xff0c;但它的一般概念仍然处于炒作和猜测的现状&#xff1f;它能破解所有已知的加密算法吗&#xff1f;它能设计出治愈所有疾病的新分子吗&#xff1f;它能很好地模拟过去和未来&#xff0c;以至于尼克奥弗曼能和他死去的儿子说话…

【Redis入门到精通二】Redis核心数据类型(String,Hash)详解

目录 Redis数据类型 1.String类型 &#xff08;1&#xff09;常见命令 &#xff08;2&#xff09;内部编码 2.Hash类型 &#xff08;1&#xff09;常见命令 &#xff08;2&#xff09;内部编码 Redis数据类型 查阅Redis官方文档可知&#xff0c;Redis提供给用户的核心数据…

dockercompose指定配置文件

dockercompose指定配置文件 文件名字必须是以下的集中形式&#xff1a; docker-compose.yaml docker-compose.yml compose.yaml compose.yml 其他名字就失败的。 一般白眉大叔都是用 compose.yaml 这个格式&#xff0c; 用习惯了。 但是我们必须知道它有几种格式都是可以…