python ctypes 回调函数_python与C语言调用模块 ctypes的详解

本文详细介绍了Python的ctypes库,用于调用C语言动态链接库。ctypes提供了加载动态链接库、转换Python对象、调用函数等功能。通过示例演示了cdll、windll和oledll的使用,以及如何处理函数调用约定。还展示了如何定义回调函数,通过示例展示了如何使用ctypes避免GIL问题。此外,文章还涵盖了结构体、联合体、数组、指针、字符串缓冲区等内容的使用方法。
摘要由CSDN通过智能技术生成

ctypes是python的一个函数库,提供和C语言兼容的数据类型,可以直接调用动态链接库中的导出函数。

为了使用ctypes,必须依次完成以下步骤:

加载动态链接库

将python对象转换成ctypes所能识别的参数

使用ctypes所能识别的参数调用动态链接库中的函数

动态链接库加载方式有三种:

cdll

windll

oledll

它们的不同之处在于:动态链接库中的函数所遵守的函数调用方式(calling convention)以及返回方式有所不同。

cdll用于加载遵循cdecl调用约定的动态链接库,windll用于加载遵循stdcall调用约定的动态链接库,oledll与windll完全相同,只是会默认其载入的函数统一返回一个Windows HRESULT错误编码。

函数调用约定:函数调用约定指的是函数参数入栈的顺序、哪些参数入栈、哪些通过寄存器传值、函数返回时栈帧的回收方式(是由调用者负责清理,还是被调用者清理)、函数名称的修饰方法等等。常见的调用约定有cdecl和stdcall两种。在《程序员的自我修养--链接、装载与库》一书的第10章有对函数调用约定的更详细介绍。

cdecl规定函数参数列表以从右到左的方式入栈,且由函数的调用者负责清除栈帧上的参数。stdcall的参数入栈方式与cdecl一致,但函数返回时是由被调用者自己负责清理栈帧。而且stdcall是Win32 API函数所使用的调用约定。

例子:

Linux下:

1567528-20201118141145127-1021697701.png

或者:

1567528-20201118141204430-1279274359.png

其他例子:

1567528-20201118141227932-1182135557.png

一个完整的例子:

1,编写动态链接库

//filename: foo.c

#include"stdio.h"

char* myprint(char *str)

{

puts(str);returnstr;

}float add(float a, floatb)

{return a +b;

}

将foo.c编译为动态链接库:

gcc -fPIC -shared foo.c -o foo.so

2.使用ctypes调用foo.so

#coding:utf8

#FILENAME:foo.py

from ctypes import *foo= CDLL('./foo.so')

myprint=foo.myprint

myprint.argtypes= [POINTER(c_char)] #参数类型为char指针

myprint.restype = c_char_p #返回类型为char指针

res = myprint('hello ctypes')print(res)

add=foo.add

add.argtype

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值