c_long和c_int是一种类型。
cdll加载使用标准cdecl调用约定导出函数的库
windll使用stdcall调用约定调用函数
oledll也使用stdcall调用约定

在linux下通过两种方法加载动态链接库:
1.cdll.LoadLibrary("libc.so.6")
2.CDLL("libc.so.6")
(结果相同)

如何告诉Python一个外来函数的形参类型和返回的值的类型呢?
答:给函数的两个属性restype和argtypes赋值。
restype-------返回类型
argtypes------参数类型
例如某函数的返回类型是float,对应到Python里就是c_float。
dll.addf.restype = c_float
如果函数的返回值是void那么可以赋值为None。另外,可以使用python 内置类型“描述”库函数的返回类型,但是,不可以用python内置类型来描述库函数的参数类型。

由于函数的参数不是固定的数量,所以需要使用列表或者是元祖来说明:
dll.addf.argtypes = (c_float,c_float)
or
dll.addf.argtypes = [c_float,c_float]

创建一个ctypes的类型(c_int、c_float、c_char...)并给他赋值
i = c_int(45)
i.value
or
i.value = 56
i.value

结构体跳过

指针
创建一个ctypes的指针:
1.byref(x[,offset]):返回x的地址,x必须为ctypes类型的一个实例。相当于c的&x。offset表示偏移量。(通过引用传递参数)
2.pointer(x):创建并返回一个指向x的指针实例,x是一个实例对象。(构造了一个真正的指针对象,因此这种方法做了很多工作,会更慢相对byref)
3.POINTER(type):返回一个类型,这个类型是指向type类型的指针类型,type是ctypes的一个类型。
eg:
>>> a = c_int(66)         # 创建一个 c_int 实例
>>> b = pointer(a)        # 创建指针
>>> c = POINTER(c_int)(a) # 创建指针
>>> b
<__main__.LP_c_long object at 0x00E12AD0>
>>> c
<__main__.LP_c_long object at 0x00E12B20>
>>> b.contents            # 输出 a 的值
c_long(66)
>>> c.contents            # 输出 a 的值
c_long(66)

令POINTER(c_int)为pointer

pointer创建的指针貌似不能修改ctypes类型

print_point函数:
>>> dll.print_point.argtypes = (POINTER(Point),)   # 指明函数的参数类型
>>> dll.print_point.restype = None                 # 指明函数的返回类型
>>>
>>> p = Point(32.4, -92.1)      # 实例化一个 Point
>>> dll.print_point(byref(p))   # 调用函数
position x 32.400002 y -92.099998>>>

当然你非要用慢一点的 pointer 也行:

>>> dll.print_point(pointer(p))  # 调用函数
position x 32.400002 y -92.099998

关于byref()-即用引用传递参数:
一般适用于需要C函数修改传入的参数,或者参数过大不适合传值,这时就要用到按引用传递。
eg:
from ctypes import *
'''
windows下
libc = cdll.LoadLibrary('msvcrt.dll')
'''
#linux下
libc = cdll.LoadLibrary('libc.so.6')
    
i = c_int()
f = c_float()
s = create_string_buffer(b'\000' * 32)
print 'i.val =', i.value
print 'f.val =', f.value
print 'repr(s.value) =', repr(s.value)
libc.sscanf(b'1 3.14 Hello', b'%d %f %s', byref(i), byref(f), s)
#3表示正确返回,0 表示不正确返回
print 'after, i.val =', i.value
print 'after, f.val =', f.value
print 'after, repr(s.value) =', repr(s.value)
输出:
i.val = 0
f.val = 0.0
repr(s.value) = ''
after, i.val = 1
after, f.val = 3.1400001049
after, repr(s.value) = 'Hello'

数组
数组是序列,包含固定数量的相同类型的实例。
推荐的创建数组类型的方法是将数据类型乘以正整数:
TenPointsArrayType  =  POINT  *  10
官方文档给出的例子是eg:
>>> from  ctypes  import  *
>>> class  POINT (Structure ):
...     _fields_  =  (“x” , c_int ), (“y” , c_int )
...
>>> class  MyStruct (Structure ):
.. 。    _fields_  =  [( “ 一” , c_int的),
...                 (“b” , c_float ),
...                 (“point_array” , POINT  * 4 )]
>>>
>>> print (len (MyStruct ()。point_array ))
4

更好的例子eg:
>>> class POINT(Structure):
#括号里第一个参数是形参的名字
...     _fields_=("x",c_int),("y",c_int)
...
>>> class MyStruct(Structure):
...     _fields_=[("a",c_int),("b",c_float),("point_array",POINT*4)]
...
>>> print(len(MyStruct().point_array))
4
>>> TenIntArrayType = c_int * 10
#如果不赋值,默认是0
>>> ta = TenIntArrayType(1,2,3,4,5,6,7,8,9,10)
>>> for item in ta:
...     print(item)
...
1
2
3
4
5
6
7
8
9
10
>>> ms = MyStruct(4,5,((1,1),(2,2),(3,3),(4,4)))
>>> for item in ms.point_array:
...     print('(item.x,item.y) = (%d,%d)' % (item.x,item.y))
...
(item.x,item.y) = (1,1)
(item.x,item.y) = (2,2)
(item.x,item.y) = (3,3)
(item.x,item.y) = (4,4)
>>>

pointer()函数指针:
>>> from ctypes import *
>>> i = c_int(42)
>>> pi = pointer(i)
>>> pi.contents
c_long(42)
注意ctypes都没有原始对象返回,也就是说每次调用pi属性时重新创建一个新的对象,那么就是:
>>> pi.contents is i
False
>>> pi.contents is pi.contents
False
在幕后,pointer()不仅创建指针实例,它必须首先创建指针类型。这是通过POINTER()接受任何ctypes类型的函数完成的,并返回一个新类型。
调用没有参数的指针类型将创建一个NULL指针。 NULL指针有一个False布尔值:
>>> null_ptr  =  POINTER (c_int )()
>>> print (bool (null_ptr ))
False
>>>

参考:点击打开链接

点击打开链接

这个↓是各种类型参数从python向c传递的教程!!!

点击打开链接

Linux下 Python通过ctypes调用cAPI (一)相关推荐

  1. libmysqld_dev linux,Linux下python玩转MySQLdb

    (0)目录 Linux下python玩转MySQLdb 一:起因 (1)Linux下安装python的第三方模块 ---- MySQLdb,自己走了很多弯路,在此做一下总结,希望对于像我一样的初学者有 ...

  2. Linux下Qt/PyQt5无法调用fcitx中文输入法解决办法

    系统平台:Linux Mint 18.3 xfce 64bit (文末有福利) 博主相关文章: (1)PyQt5练习:结合matplotlib绘图 (2)PyQt5练习:词典翻译 (3)Linux下Q ...

  3. linux下python退出命令_Linux 下 Python按任意键退出方法

    某天在群内有同学问到,在python下我用input或者raw_input都得输入完后回车才能获取到输入的值,那如何实现任意键退出暂停等功能呢,我当时也没有多想,因为接触python时间也不算长,主要 ...

  4. 在linux下python爬虫进程发生异常时自动重启直至正常结束的方法

    在linux下python爬虫进程发生异常时自动重启直至正常结束的方法 参考文章: (1)在linux下python爬虫进程发生异常时自动重启直至正常结束的方法 (2)https://www.cnbl ...

  5. linux下载哪个python版本-修改linux下python的默认版本

    linux下python版本默认为python2.7,下面将通过操作在linux系统下修改python的默认版本. 本文linux系统使用的是ubuntu19. 操作: 1.在shell下输入pyth ...

  6. Linux下Python脚本自启动与定时任务详解

    这篇文章主要给大家介绍了关于Linux下Python脚本自启动与定时任务的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值. 前言 最近同事问了一个关于P ...

  7. linux下python安装opencv库_Linux下怎么配置python和opencv

    匿名用户 1级 2017-06-20 回答 以下说明在Linux下Python和OpenCV结合安装的过程,Python要使用OpenCV模块,则必须导入OpenCV提供的包,所以要提供Python支 ...

  8. Linux下python安装升级详细步骤 | Python2 升级 Python3

    Linux下python升级步骤  Python2 ->Python3 多数情况下,系统自动的Python版本是2.x 或者yum直接安装的也是2.x 但是,现在多数情况下建议使用3.x 那么如 ...

  9. linux下python 2.4升级到 python 2.5

    linux下python 2.4升级到 python 2.5 2010-08-08 01:53:33 标签:python升级 linux 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 ...

最新文章

  1. 使用 IntraWeb (36) - TIWServerControllerBase
  2. 在C#中使用官方驱动操作MongoDB
  3. 2016.7.14最新cocoapods最新安装教程
  4. Java读取HttpServletRequest的post数据流
  5. UNIX环境高级编程(第三版)关于apue.h的用法
  6. html5d调用百度语音,易语言调用百度语音平台实现文字转换语音功能的代码
  7. mysql explode函数_hive中,lateral view 与 explode函数
  8. Ural 1043 Cover the Arc
  9. 廖雪峰python博客_廖雪峰python实战
  10. Sopcast for linux更新至3.01!
  11. 使用canvas画一个流星动画送给她吧
  12. Azure Command Line(Azure CLI)指南
  13. 【网络安全】上网行为管理
  14. 佳能3000系列打印机打开打印机wps连接路由器
  15. 纯前端 导出excel 插件xlsx和file-saver
  16. SAP中的邮件通讯处理
  17. 户外广告 android系统,十目户外广告监测监管系统下载-十目监测(户外广告监测app)v1.0.0 安卓版-腾牛安卓网...
  18. 阿里云安骑士和态势感知SAS有区别吗?
  19. Imageware导出图片在论文中使用
  20. Java实现 蓝桥杯VIP 算法提高 现代诗如蚯蚓

热门文章

  1. UEFI启动-GPT分区,Windows 7+ 系统引导修复
  2. Java筑基18-布置作业啦(考查抽象类、内部类、工厂模式等)
  3. Elasticsearch 7.10 之 Similarity module
  4. Aardio 第一天:使用虚表和适配器+试融合Java
  5. c语言二维数组a中,a,a[0],a[0][0]的值与值的类型
  6. 最新FL Studio 21中文版发布啦!全新的FL音频剪辑封套、主题和插件
  7. 苹果吃鸡蓝牙耳机推荐哪个?性价比高的游戏蓝牙耳机推荐
  8. 【Git从入门到精通】Git入门
  9. 你以为Shell只是命令行?读懂这篇文,给你的工作赋能
  10. python 常见算法题