使用python向C语言的链接库传递数组、结构体、指针类型的数据

由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来调用C语言的代码库。

至于如何调用基础数据类型的数据,请大家参考我的另外一篇文章:Python使用ctypes调用C/C++的方法

1. 使用python给C语言函数传递数组类型的参数

想必很多时候,C语言会使用数组作为参数,在之前我们使用过ctypes的一些数据类型作为C语言参数类型,包括byte、short、int、double之类的,但是在使用数组类型的时候,我们也是有着类似的做法,下面我们看实例:

1.1 C语言的代码块

一个简单的数组输入,以及一个简单将数组作为参数的函数

int input[2] = [0, 1]

void printIntArray(int[] input){

for(int i = 0; i < 2; i ++){

print(input[i]);

}

}

1.2 python代码块

下面我们将演示如何调用上面的代码

from ctypes import *

# 假设上面的代码被编译成了一个XXXXlib.so的文件

dll = CDLL('XXXXlib.so')

# 声明一个数组类型

INPUT = c_int * 2

# 实例化一个长度为2的整型数组

input = INPUT()

# 为数组赋值(input这个数组是不支持迭代的)

input[0] = 1

input[1] = 2

# 引用C语言的函数

print_int_array = dll.printIntArray

# 调用C语言的函数

print_int_array(input)

1.3 小结

使用数组的方法基本就是这样的,声明什么类型的数组只需要根据之前python官方文档里ctypes使用说明对照着声明数组就可以了。

2. 使用python给C语言函数传递结构体类型的参数

当然,为了满足一些个性化的需求和为了使程序更容易让人理解,更多的时候开发人员也会使用结构体类型的变量为函数赋值。现在我们使用ctypes来实例化一个C语言的结构体,请看实例:

由于第一部分我们已经介绍了如何简单的调用C语言的函数,我们下面只写结构体相关的python代码

from ctypes import *

# 声明一个类,继承自ctypes.Structure

class PythonStructure(Structure):

_fields_:[('param1',c_int),('param2', c_int),('param3', c_int * 2)]

# 实例化变量

python_structure = PythonStructure()

# 赋值

python_structure.param1 = 1

python_structure.param2 = 3

PARAM = c_int * 2

param3 = PARAM()

param3[0] = 3

param3[1] = 4

python_structure.param3 = param3

从代码中我们可以看到,我们声明了一个class,使其继承自ctypes.Structure,然后在类的内部声明了变量,fields这样一个变量域,里面用元组存贮这结构体的每个结构体内部变量的变量名和数据类型。

然后在实际的使用过程中,首先要实例化一个PythonStructure类型的变量,然后为其各个内部变量赋值。

3. 使用python给C语言函数传递指针类型的参数

指针作为C语言相比于其他原因最大的优势,在C语言程序中会大量的使用指针,因此将指针类型的数据作为参数传递其实是十分的普遍的,下面我们直接上实例:

3.1 C语言函数声明

void test(pystruct *ps)

假设这里的pystruct与我们在第二部分声明的结构体相对应(我这渣渣C语言功底实在是怕写出什么错误的代码误导大家)

3.2 python代码

使用指针类型的数据只需要在调用btref()就可以了

from ctypes import *

# 声明一个类,继承自ctypes.Structure

class PythonStructure(Structure):

_fields_:[('param1',c_int),('param2', c_int),('param3', c_int * 2)]

# 实例化变量

python_structure = PythonStructure()

# 赋值

python_structure.param1 = 1

python_structure.param2 = 3

PARAM = c_int * 2

param3 = PARAM()

param3[0] = 3

param3[1] = 4

python_structure.param3 = param3

# 开始调用

dll = CDLL('XXXXlib.so')

test = dll.test

# 传递参数

test(byref(python_structure))

4.写在最后

以上就是我们今天踩过的坑,其实发现网上对于ctypes的相关文章不是很多,因此想写出来跟大家分享一下,希望大家少踩坑,快速的完成任务,远离加班,周末愉快!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

本文标题: 使用Python向C语言的链接库传递数组、结构体、指针类型的数据

本文地址: http://www.cppcns.com/jiaoben/python/251378.html

python中的记录指针_使用Python向C语言的链接库传递数组、结构体、指针类型的数据...相关推荐

  1. python结构体数组传出接收c动态库_使用Python向C语言的链接库传递数组、结构体、指针类型的数据...

    使用python向C语言的链接库传递数组.结构体.指针类型的数据 由于最近的项目频繁使用python调用同事的C语言代码,在调用过程中踩了很多坑,一点一点写出来供大家参考,我们仍然是使用ctypes来 ...

  2. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例

    C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...

  3. c语言如何将值赋给结构体指针,C语言给结构体指针赋值

    <C语言给结构体指针赋值>由会员分享,可在线阅读,更多相关<C语言给结构体指针赋值(6页珍藏版)>请在人人文库网上搜索. 1.指向结构体的指针 在C语言中几乎可以创建指向任何类 ...

  4. python中的递归思想_〖Python〗-- 递归、面向对象初识及编程思想

    [递归.面向对象初识及编程思想] 一.递归 1.定义: 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. (1)递归就是在过程或函数里调用自身: (2)在使用递归策 ...

  5. c/c++教程 - 1.10 结构体 使用typedef定义struct结构体 结构体数组 结构体指针 结构体嵌套 结构体做函数参数 结构体const

    十二.结构体 (1)结构体定义和使用 基本概念:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型. 参考视频:https://www.bilibili.com/video/BV1et411b ...

  6. c语言结构内部定义指针,C语言知识补漏(一)结构体指针以及位域定义

    一.结构体指针 typedef struct { unsigned long int DATA; unsigned long int DIRECTION; unsigned long int INTE ...

  7. 2020.1.13 C语言学习 结构体+结构体数组+结构体指针

    结构体 结构体的形式 struct 结构体名称 { 结构体成员1; 结构体成员2; - }; 例如: 图书的结构体 struct Book {char title[128];char author[4 ...

  8. python中类似对象吗_在Python中,两个对象什么时候相同? - python

    似乎2 is 2和3 is 3在python中始终为true,通常,对整数的任何引用都与对相同整数的任何其他引用相同. None(即None is None)也是如此.我知道用户定义类型或可变类型不会 ...

  9. python中case的用法_用 Python 实现简单的 switch/case 语句

    在Python中是没有Switch / Case语句的,很多人认为这种语句不够优雅灵活,在Python中用字典来处理多条件匹配问题字典会更简单高效,对于有一定经验的Python玩家不得不承认,的确如此 ...

最新文章

  1. 2022-2028年中国中小企业电子商务市场投资分析及前景预测报告
  2. 地区的json数据_Python 连接开放航空交通数据,轻松构建航班跟踪应用!
  3. 牛客题霸 NC4 判断链表中是否有环
  4. MySQL 深潜 - MDL 锁的实现与获取机制
  5. Error: 'conda' can only be installed into the root environment
  6. oralce 11g rac ocr和votedisk迁移
  7. Lesson 1 A puma at large
  8. [python] 字典 pop(key)函数:删除字典中key及其值,并返回该值
  9. python新浪api_python调用新浪微博API项目实践
  10. typora 公式对齐_让 Markdown 写作更简单 Typora 完全使用指南
  11. 安装磁盘阵列卡的方法
  12. html中output标签详细介绍
  13. oracle 官网下载api,Oracle官网下载Java的api离线文档
  14. html新浪短域名api,新浪短网址API接口
  15. 99%的人误解BLM中的“战略”与“执行”的关系及错误认为BLM/BEM就是战略解码的全部!
  16. ppt模板目录页如何排版设计?
  17. 蓝桥杯Python初级组测试题之Turtle画图2
  18. 如何使WooCommerce产品属性更加突出
  19. 计算机连接电视显示超范围,HDMI连接后电脑操作界面的边框超出电视屏幕,怎么解决...
  20. 哈希表实现电话号码查询系统(c++)

热门文章

  1. 柏林噪声实践 水与火,顶点纹理拾取
  2. 数据平台-第一章-数据质量提升
  3. kafka Failed to send producer
  4. 11月10日云栖精选夜读:零点之战!2017双11关键技术全公开
  5. Ubuntu 16.04安装录屏软件SimpleScreenRecorder
  6. Javascript实现简单的选项卡
  7. 201521123016《Java设计与程序》第6周学习总结
  8. 黄聪:Discuz自制模板带jquery时与discuz本身冲突解决办法
  9. VirtualBox 安装 Ubuntu 14.10 花屏 解决方案
  10. python 与或非_“2020”假看完本文若不能让你学通“Python”,我将永远退出IT界!...