Linux下Python调用C语言
一:Python调用C语言场景
1,已经写好的C语言代码,不容易用Python实现,想直接通过Python调用写好的C语言代码
2,C比Python快(只是从语言层面,不能绝对说C程序就是比Python快)
3,想直接调用C语言丰富的库
二:Python的CTypes库
Python中调用C语言不止一种方法,常见的有:
1.SWIG,编写一个额外的接口文件来作为SWIG(终端工具)的入口
2.通过CTypes调用
3.使用Python/C API方法
但是 CTypes是最简单上手的一种,本文将用CTypes来演示如何在Python中调用C
可以先看看CTypes支持的类或者方法
>>> import ctypes
>>>
>>> dir(ctypes)
['ARRAY', 'ArgumentError', 'Array', 'BigEndianStructure', 'CDLL', 'CFUNCTYPE', 'DEFAULT_MODE', 'LibraryLoader', 'LittleEndianStructure', 'POINTER', 'PYFUNCTYPE', 'PyDLL', 'RTLD_GLOBAL', 'RTLD_LOCAL', 'SetPointerType', 'Structure', 'Union', '_CFuncPtr', '_FUNCFLAG_CDECL', '_FUNCFLAG_PYTHONAPI', '_FUNCFLAG_USE_ERRNO', '_FUNCFLAG_USE_LASTERROR', '_Pointer', '_SimpleCData', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_c_functype_cache', '_calcsize', '_cast', '_cast_addr', '_check_size', '_ctypes_version', '_dlopen', '_endian', '_memmove_addr', '_memset_addr', '_os', '_pointer_type_cache', '_reset_cache', '_string_at', '_string_at_addr', '_sys', '_wstring_at', '_wstring_at_addr', 'addressof', 'alignment', 'byref', 'c_bool', 'c_buffer', 'c_byte', 'c_char', 'c_char_p', 'c_double', 'c_float', 'c_int', 'c_int16', 'c_int32', 'c_int64', 'c_int8', 'c_long', 'c_longdouble', 'c_longlong', 'c_short', 'c_size_t', 'c_ssize_t', 'c_ubyte', 'c_uint', 'c_uint16', 'c_uint32', 'c_uint64', 'c_uint8', 'c_ulong', 'c_ulonglong', 'c_ushort', 'c_void_p', 'c_voidp', 'c_wchar', 'c_wchar_p', 'cast', 'cdll', 'create_string_buffer', 'create_unicode_buffer', 'get_errno', 'memmove', 'memset', 'pointer', 'py_object', 'pydll', 'pythonapi', 'resize', 'set_errno', 'sizeof', 'string_at', 'wstring_at']
>>>
其中cdll类对于我们接下来调用C非常有用处,我们通过help来查看cdll类,可以看到可以通过LoadLibrary来加载C的库(在Linux中是.so,在windows中是.dll)

三:实战
1,调用C语言的函数
首先我们在C语言中实现三个简单函数
#include<stdio.h>void cprintf()
{printf("Hello word!\n");return;
}int add(int a, int b)
{return a+b;
}int cscanf()
{int a;int b;scanf("%d %d",&a,&b);return a+b;
}
三个函数,一个是有打印函数,一个是有传参函数,一个是有输入函数,将C编译成动态库
gcc -fPIC -c ctest.c -o ctest.o
gcc -shared -o libctest.so ctest.o
然后我们在Python中调用这三个函数,
from ctypes import *cLib = cdll.LoadLibrary('./libctest.so')cLib.cprintf()a = 1
b = 2
sum = cLib.add(a,b)
print(f'{a}+{b}={sum}')cSum = cLib.cscanf()
print(f'cSum={cSum}')
运行

可以看到运行结果与我们想要的结果一致
2,调用C语言返回值是指针的函数
C代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define uint8_t unsigned char
#define uint16_t unsigned shorttypedef struct TagMyStruct
{char name[10];uint8_t age;int score;
} MyStruct,*MyStructPointer;MyStructPointer cstruct_get_data_pointer() // 返回结构体指针
{MyStructPointer pt = (MyStructPointer)malloc(sizeof(MyStructPointer));strcpy(pt->name, "ftz");pt->age = 18;pt->score = 88;return pt;
}MyStruct cstruct_get_data_self() // 返回结构体
{return (MyStruct){"csdn",100,99};
}
python调用
from ctypes import *cLib = cdll.LoadLibrary('./cstruct.so')class MyStruct(Structure):_fields_ = [('name', c_char*10),('age', c_ubyte),('score', c_int), ]cLib.cstruct_get_data_self.restype = MyStruct #指定函数返回值结构体本身
dat = cLib.cstruct_get_data_self()
print("=====get struct self from .so function=======")
print("name=",dat.name)
print("age=",dat.age)
print("score=",dat.score)cLib.cstruct_get_data_pointer.restype = POINTER(MyStruct) #指定函数返回值结构体指针
dat = cLib.cstruct_get_data_pointer()
print("=====get struct point from .so function=======")
print("name=",dat.contents.name)
print("age=",dat.contents.age)
print("score=",dat.contents.score)
运行结果

相关文章:
Linux下Python调用C语言
一:Python调用C语言场景 1,已经写好的C语言代码,不容易用Python实现,想直接通过Python调用写好的C语言代码 2,C比Python快(只是从语言层面,不能绝对说C程序就是比Python快) 3&…...
SQL Server对象类型(8)——4.8.约束(Constraint)
4.8. 约束(Constraint) 4.8.1. 约束概念 与Oracle中的一样,SQL Server中,约束是虚的、被定义的数据库对象,其本身并不存储数据,其通过一些内置或用户自定义逻辑来实现对表中数据的检查和限制,以使这些表数据符合某个或某些规则或标准,从而实现数据的规则化、标准化和…...
苍穹外卖--导出运营数据Excel报表
导出运营数据Excel报表 需求分析和设计 产品原型 在数据统计页面,有一个数据导出的按钮,点击该按钮时,其实就会下载一个文件。这个文件实际上是一个Excel形式的文件,文件中主要包含最近30日运营相关的数据。表格的形式已经固定…...
cocos creator-碰撞检测
碰撞检测文档 刚体自行选择,刚体正常设置分组、tag,tag用于区分是哪个物体被碰撞了 正常在一个node下挂载脚本就行 注意:Builtin 2D 物理模块只会发送 BEGIN_CONTACT 和 END_CONTACT 回调消息。ccclass(TestContactCallBack) export class …...
算法通关第十七关黄金挑战——透析跳跃问题
大家好,我是怒码少年小码。 本篇是贪心思想的跳跃问题专题,跳跃问题出现的频率很高。 跳跃游戏 LeetCode 55:给你一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。 …...
GPT带我学Openpyxl操作Excel
注:以下文字大部分文字和代码由GPT生成 一、openpyxl详细介绍 Openpyxl是一个用于读取和编写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它允许您使用Python操作Excel文件,包括创建新的工作簿、读取和修改现有工作簿中的数据、设置单元格格式以及编…...
图扑参展高交会-全球清洁能源创新博览会
“相聚鹏城深圳,共享能源盛宴” 第二十五届中国国际高新技术成果交易会(简称“高交会”)于 11 月 15-18 日在深圳盛大开幕。高交会由商务部、科学技术部、工业和信息化部、国家发展改革委、农业农村部、国家知识产权局、中国科学院、中国工程院和深圳市人民政府共同…...
vue v-permission权限指令
控制页面及按钮的显示隐藏 src/directive/permission/index.js import permission from ./permissionconst install function(Vue) {Vue.directive(permission, permission) }if (window.Vue) {window[permission] permissionVue.use(install); // eslint-disable-line }per…...
ER图是什么,怎么画?
ER图(Entity-Relationship Diagram)是一种用于描述实体间关系的图形化表示方法。它主要用于数据库设计,可以清晰地展示实体、属性和实体间的联系。常用的ER图类型包括: 实体-关系模型(Entity-Relationship Model&…...
基于51单片机的十字路口交通灯_5s黄灯倒计时闪烁
基于51单片机十字路口交通灯_5s黄灯闪烁 (程序仿真仿真视频) 仿真:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:J006 功能要求 交通灯运行状态: (1&…...
JavaWeb | JSP内置对象
目录: 1.认识JSP内置对象2.JSP内置对象的特点3.九大内置对象3.1 out对象的作用向 “客户端” 输出各种数据内容对 “服务器” 上的输出缓冲区进行管理 3.2 request对象的作用能够获取客户端的基本信息 3.3 response对象的作用利用response对象进行 “重定向”利用re…...
如何保持高能量
精力管理 精力管理对于平衡多项任务和保持热情至关重要。 通过自我积极反馈循环系统培养积极的内心声音。 培养仪式和习惯来控制内心的声音并保持能量。 学习语言带来正能量和宝贵的技能 保持高能量需要自我赋权和体力充电。 经常锻炼有很多好处,包括改善健康…...
Oracle研学-基础操作
学自B站黑马程序员笔记 一 创建表空间(创建数据文件) 创建表空间同时会创建一个数据文件(下面5行应该是一句话),表空间在PLSQL的Object的tablespace中可以看到 create tablespace waterboss //创建表空间 datafile c:\waterboss.dbf //创建表空间对应的…...
jmeter下载地址
Jmeter安装教程【5.5】【Windows】jmeter详细安装配置教程,装不好你打我_一只莽夫的博客-CSDN博客...
C语言,求取数组的序亏:已知一个整数数组,求出个数组中每个元素在整个 数组的排序。
要求获取整数数组中每个元素的排序,可以使用以下方法: 1. 定义一个结构体数组,其中每个结构体包含数组元素的值和索引。 2. 遍历整数数组,将每个元素与其索引一起存储到结构体数组中。 3. 对结构体数组进行排序,按照…...
信息流广告行为兴趣定向底层逻辑算法
行为兴趣定向 1: 行为兴趣的背后是计划的数据 行为是用户在平台的动作:点赞、评论、分享、点击、下单、成交等,用户发生过的标签 兴趣不一定发生,我有打高尔夫的兴趣,但是从来没打过,因为穷 系统会根据用户的行为标…...
Selenium——isDisplayed()、isEnabled()、isSelected()
判断页面是否存在某元素 Selenium没有直接提供判断是否存在的方法,可以使用findElements返回的数量判断;或者判断findElement是否抛出异常 webDriver.findElements(By.xpath("(//div[classel-button-group]//button)[1]")).size()isDisplaye…...
unity UGUI中获取点击位置处的URL链接
需求是,我们在一个text组件中像写网页那样写入链接,然后点击这个链接,就能访问配置的网页啥的。比如: <a href"hello">链接文本</a></summary> 最终的效果如下: 图中,image区…...
【Arduino库之:FastLED库】
第一:基础 led [ 0 ] CRGB::Red; //为第一个灯珠设置红色 FastLED.show(); //这个作用才会显示 示例程序: #include <FastLED.h> #define NUM_LEDS 8 #define DATA_PIN 7 #define CLOCK_PIN 13 CRGB leds[NUM_LEDS]; CRGB myGRBcolor(0…...
两道面试题秒杀你的C++基础!
大家好,我是光城,今天发两个非常重要的面试题,可以留言区说出你的答案,这两个题目都比较重要,看你能答对不? 1.C中初始化变量有几种方式,各自有什么区别? 或者说Initialization分为哪…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
