python调用函数库_15.17. ctypes — Python 的外部函数库 — Python 2.7.18 文档

15.17.1.17.Callback functions¶

ctypes allows creating C callable function pointers from Python callables.

These are sometimes called callback functions.

First, you must create a class for the callback function, the class knows the

calling convention, the return type, and the number and types of arguments this

function will receive.

The CFUNCTYPE factory function creates types for callback functions using the

normal cdecl calling convention, and, on Windows, the WINFUNCTYPE factory

function creates types for callback functions using the stdcall calling

convention.

Both of these factory functions are called with the result type as first

argument, and the callback functions expected argument types as the remaining

arguments.

I will present an example here which uses the standard C library’s qsort()

function, this is used to sort items with the help of a callback function.

qsort() will be used to sort an array of integers:

>>>IntArray5 = c_int * 5

>>>ia = IntArray5(5, 1, 7, 33, 99)

>>>qsort = libc.qsort

>>>qsort.restype = None

>>>

qsort() must be called with a pointer to the data to sort, the number of

items in the data array, the size of one item, and a pointer to the comparison

function, the callback. The callback will then be called with two pointers to

items, and it must return a negative integer if the first item is smaller than

the second, a zero if they are equal, and a positive integer else.

So our callback function receives pointers to integers, and must return an

integer. First we create the type for the callback function:

>>>CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int))

>>>

For the first implementation of the callback function, we simply print the

arguments we get, and return 0 (incremental development ;-):

>>>def py_cmp_func(a, b):

... print "py_cmp_func", a, b

... return 0

...

>>>

Create the C callable callback:

>>>cmp_func = CMPFUNC(py_cmp_func)

>>>

And we’re ready to go:

>>>qsort(ia, len(ia), sizeof(c_int), cmp_func)

py_cmp_func

py_cmp_func

py_cmp_func

py_cmp_func

py_cmp_func

py_cmp_func

py_cmp_func

py_cmp_func

py_cmp_func

py_cmp_func

>>>

We know how to access the contents of a pointer, so lets redefine our callback:

>>>def py_cmp_func(a, b):

... print "py_cmp_func", a[0], b[0]

... return 0

...

>>>cmp_func = CMPFUNC(py_cmp_func)

>>>

Here is what we get on Windows:

>>>qsort(ia, len(ia), sizeof(c_int), cmp_func)

py_cmp_func 7 1

py_cmp_func 33 1

py_cmp_func 99 1

py_cmp_func 5 1

py_cmp_func 7 5

py_cmp_func 33 5

py_cmp_func 99 5

py_cmp_func 7 99

py_cmp_func 33 99

py_cmp_func 7 33

>>>

It is funny to see that on linux the sort function seems to work much more

efficiently, it is doing less comparisons:

>>>qsort(ia, len(ia), sizeof(c_int), cmp_func)

py_cmp_func 5 1

py_cmp_func 33 99

py_cmp_func 7 33

py_cmp_func 5 7

py_cmp_func 1 7

>>>

Ah, we’re nearly done! The last step is to actually compare the two items and

return a useful result:

>>>def py_cmp_func(a, b):

... print "py_cmp_func", a[0], b[0]

... return a[0] - b[0]

...

>>>

Final run on Windows:

>>>qsort(ia, len(ia), sizeof(c_int), CMPFUNC(py_cmp_func))

py_cmp_func 33 7

py_cmp_func 99 33

py_cmp_func 5 99

py_cmp_func 1 99

py_cmp_func 33 7

py_cmp_func 1 33

py_cmp_func 5 33

py_cmp_func 5 7

py_cmp_func 1 7

py_cmp_func 5 1

>>>

and on Linux:

>>>qsort(ia, len(ia), sizeof(c_int), CMPFUNC(py_cmp_func))

py_cmp_func 5 1

py_cmp_func 33 99

py_cmp_func 7 33

py_cmp_func 1 7

py_cmp_func 5 7

>>>

It is quite interesting to see that the Windows qsort() function needs

more comparisons than the linux version!

As we can easily check, our array is sorted now:

>>>for i in ia: print i,

...

1 5 7 33 99

>>>

注解

Make sure you keep references to CFUNCTYPE() objects as long as they

are used from C code. ctypes doesn’t, and if you don’t, they may be

garbage collected, crashing your program when a callback is made.

Also, note that if the callback function is called in a thread created

outside of Python’s control (e.g. by the foreign code that calls the

callback), ctypes creates a new dummy Python thread on every invocation. This

behavior is correct for most purposes, but it means that values stored with

threading.local will not survive across different callbacks, even when

those calls are made from the same C thread.

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值