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分为哪…...
学浪视频下载终极方案:Fiddler+N_m3u8D联动配置避坑指南
学浪视频高效下载实战:Fiddler与N_m3u8D深度配置指南 在知识付费盛行的时代,学浪平台汇聚了大量优质课程资源。对于需要反复学习或离线观看的用户而言,掌握一套稳定高效的视频下载方法显得尤为重要。本文将深入探讨如何通过Fiddler抓包工具与…...
旧iOS设备维护全流程解决方案:Legacy iOS Kit实用指南
旧iOS设备维护全流程解决方案:Legacy iOS Kit实用指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit Legacy…...
写作压力小了!2026年首选推荐的专业降AI率软件
2026年论文降AI率工具已从“基础改写”升级为智能优化系统,核心评价维度包括AIGC识别精度、文本自然度、学术合规性、查重适配性、多语言支持与操作便捷性。本次测评覆盖6款主流工具,涵盖中英文论文、全流程与专项功能、免费与付费版本,让你高…...
微电网集中式架构vs分布式架构:设计差异与选型依据
微电网作为整合“源、储、荷、网”的新型能源系统,其架构设计直接决定系统的运行效率、可靠性、扩展性与经济性,是微电网规划建设的核心环节。在微电网主流架构中,集中式架构与分布式架构凭借各自的技术特性,适配不同的应用场景与…...
5个宝可梦ROM定制技巧:pk3DS开源工具打造个性化游戏体验
5个宝可梦ROM定制技巧:pk3DS开源工具打造个性化游戏体验 【免费下载链接】pk3DS Pokmon (3DS) ROM Editor & Randomizer 项目地址: https://gitcode.com/gh_mirrors/pk/pk3DS 宝可梦游戏的重复游玩体验一直是玩家面临的核心挑战,如何通过技术…...
Python实战:用SymPy解常微分方程 vs 偏微分方程的5个关键差异
Python实战:用SymPy解常微分方程 vs 偏微分方程的5个关键差异 微分方程是数学建模的核心工具,而Python的SymPy库让符号计算变得触手可及。但当你真正在Jupyter Notebook中敲下dsolve()命令时,是否困惑过为什么有些方程秒出结果,有…...
3个核心功能解决Windows 11系统问题:Win11Debloat优化工具深度评测
3个核心功能解决Windows 11系统问题:Win11Debloat优化工具深度评测 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更…...
反线性学习—— 不是“按顺序学完教材”,是“围绕目标把知识长出来”
反线性学习—— 不是“按顺序学完教材”,是“围绕目标把知识长出来”在传统的学习习惯中,我们往往有一种 “进度条强迫症”:只要书看完了、课听完了、笔记记满了,就觉得自己“学完了”。 但现实往往很残酷:当你合上书本…...
深入解析 Promise 核心原理,从零手写实现到实战应用
1. Promise 基础概念与使用场景 1.1 什么是 Promise? 想象你点了一份外卖,商家给你一个取餐号而不是立即给你食物。这个取餐号就是 Promise,它代表一个未来才会完成的操作(外卖送达)。在 JavaScript 中,Pro…...
如何使用USearch构建自动驾驶传感器数据的实时向量搜索系统
如何使用USearch构建自动驾驶传感器数据的实时向量搜索系统 【免费下载链接】usearch Fastest Open-Source Search & Clustering engine for Vectors & 🔜 Strings in C, C, Python, JavaScript, Rust, Java, Objective-C, Swift, C#, GoLang, and Wolfra…...
