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.xdnf.cn/news/1540851.html

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

相关文章

界面控件Telerik UI for WinForms 2024 Q3概览 - 支持合并单元格等

Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件。所有的UI for WinForms控件都具有完整的主题支持,可以轻松地帮助开发人员在桌面和平板电脑应用程序提供一致美观的下一代用户体验。 本文将介绍界面组件Telerik UI for WinForms在今年第一…

Linux 系统进程理解——标识符,状态

目录 进程描述-pcb 并行与并发 概念: 课本概念:程序的一个执行实例,正在执行的程序等 内核观点:担当分配系统资源(CPU时间,内存)的实体 这短短的两行就概括了进程,但是进程的内在…

一个能同时to B和to C、批发零售一体化的需求分析和系统设计

一些企业纠结自己的模式是to B还是to C,一些企业在to B和to C中转型,还有一些企业在做着to B的业务,也在做to C的代发,这些企业在不停地变更着业务,更换着系统,给企业带来巨大的资金和时间成本,…

21、Tomato

难度 低(个人认为中) 目标 root权限 一个flag 使用VMware启动 kali 192.168.152.56 靶机 192.168.152.66 信息收集 端口信息收集 可以看到有个ftp服务,2211实际是ssh协议端口,80、8888是一个web服务 web测试 80端口显示一个tomato 查看源码给了一些…

grafana 使用常见问题

一、点击 panel 没有反应,没有出现 edit 选项。 方法一 将鼠标放在 panel 的任意位置,然后键盘输入 "e",然后再次点击 title,即可出现选项框。 方法二 F12 查看当前 panel id,然后在浏览器 url 地址上拼接…

技术成神之路:设计模式(十四)享元模式

介绍 享元模式(Flyweight Pattern)是一种结构性设计模式,旨在通过共享对象来有效地支持大量细粒度的对象。 1.定义 享元模式通过将对象状态分为内部状态(可以共享)和外部状态(不可共享)&#xf…

Godot游戏如何提升触感体验

在游戏世界中,触感体验至关重要,既能极大提升玩家沉浸感,让其深度融入游戏,在操作角色或与环境互动时,通过触感反馈获得身临其境的真实感(比如动作游戏中角色攻击或受击时的振动反馈,能使玩家更…

STM8L101低功耗的理解

一.通过降低时钟频率来降低功耗: 规格书如图 1.code 从flash启动,主频率是16Mhz时,功耗测量2.51ma左右,对应程序如下: 2.code从flash启动,主频率是2Mhz时(上电默认值),功…

视频美颜SDK核心功能解析:打造高效直播美颜工具方案详解

随着直播行业的迅猛发展,用户对于直播画质和个人形象的要求越来越高。视频美颜SDK作为一项关键技术,已经成为各大直播平台和短视频应用的重要组成部分。通过实时美颜技术,用户能够在直播过程中呈现出更加理想的形象,从而提升直播体…

【计算机网络篇】物理层

本文主要介绍计算机网络第二章节的物理层,文中的内容是我认为的重点内容,并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 文章目录 🎯一.基本概念及公式 🎃基本概念…

推荐系统-电商直播 多目标排序算法探秘

前言: 电商直播已经成为电商平台流量的主要入口,今天我们一起探讨推荐算法在直播中所面临的核心问题和解决方案。以下内容参考阿里1688的技术方案整理完成。 一、核心问题介绍 在电商网站中,用户的主要行为是在商品上的行为,直播…

STM32G431RBT6(蓝桥杯)串口(发送)

一、基础配置 (1) PA9和PA10就是串口对应在单片机上的端口 注意:一定要先选择PA9的TX和PA10的RX,再去打开异步的模式 (2) 二、查看单片机的端口连接至电脑的哪里 (1)此电脑->右击属性 (2)找到端…

轻量级RSS阅读器Fusion

什么是 Fusion ? Fusion 是一款轻量级、自托管的 RSS 聚合器和阅读器。 软件主要特点: 自动分组、书签、搜索、嗅探信息导入/导出 OPML 文件支持 RSS、Atom、JSON 类型的 feed响应式、明/暗模式、PWA轻量级,自托管友好 使用 Golang 和 SQLit…

c语言面试字符串复制

1&#xff0c;下面这个函数的打印是什么&#xff1a; #include<stdio.h> #include<string.h>int main() {char str0[5], str1[] "welcome";strcpy(str0, str1);printf("str0:%s\r\n",str0);printf("str1:%s\r\n",str1); } larkla…

Linux:虚拟文件系统/proc和self进程

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 /proc目录 在Linux操作系统中&#xff0c;目录/proc是一个虚拟文件系统&#xff0c;称为procfc&#xff0c;用于访问内核和系统的实时状态信息。这个文件系统不同于常规…

java-----IDE(集成开发环境)

IDE&#xff08;集成开发环境&#xff09; IDE&#xff08;集成开发环境&#xff09;-IDEA IDEA 介绍 1) IDEA 全称 IntelliJ IDEA2) 在业界被公认为最好的Java开发工具3) IDEA是JetBrains 公司的产品&#xff0c;总部位于捷克的首都布拉格4) 除了支持Java开发&#xff0c;还…

国标GB28181视频融合监控汇聚平台的方案实现及场景应用

Liveweb国标视频融合云平台基于端-边-云一体化架构&#xff0c;部署轻量简单、功能灵活多样&#xff0c;平台可支持多协议&#xff08;GB28181/RTSP/Onvif/海康SDK/Ehome/大华SDK/RTMP推流等&#xff09;、多类型设备接入(IPC/NVR/监控平台)&#xff0c;在视频能力上&#xff0…

Cloudera安装不再复杂:基础环境设置详解

Cloudera Manager是CDH市场领先的管理平台。它以其强大的数据管理和分析能力&#xff0c;帮助企业能够轻松驾驭海量数据&#xff0c;实现数据的实时分析与洞察。 作为业界第一的端到端 Apache Hadoop 的管理应用&#xff0c;Cloudera Manager对CDH的每个部件都提供了细粒度的可…

我与Linux的爱恋:进程优先级|进程切换

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;Linux的学习 文章目录 1.进程优先级1.什么是进程优先级&#xff1f;2.进程优先级的类型3.进程优先级的作用4.进程优先级的实现5.进程优先级的重要性6.查看系统进程7.修改进程优先级8.优先…

mysql笔记—sql性能分析

1.查看数据库各个语句的执行频次 show global/session status like ‘com__’ 2.慢查询 默认没有开启&#xff0c;需要手动开启&#xff08;在/etc/my.cnf中开启&#xff09; 开启后在localhost-slow.log中可以查询到慢查询的语句的相关信息&#xff1a; 3.explain 用法&…