ctypes python_[python学习之路]ctypes,Python

本文介绍了Python中ctypes模块的使用方法,包括如何查找和加载C标准库,如何调用C函数,特别是涉及参数类型转换和返回值处理。通过示例展示了如何调用C数学库的atan2函数,并解决调用过程中遇到的问题。最后,演示了如何结合Numpy数组调用C动态链接库中的函数,实现数值计算。
摘要由CSDN通过智能技术生成

ctypes

基本用法

ctypes

是一个方便

Python

调用本地已经编译好的外部库的模块。

from ctypes import util, CDLL

标准 C 库

使用

util

来找到标准

C

库:

libc_name = util.find_library('c')

# on WINDOWS

print libc_name

msvcr90.dll

使用

CDLL

来加载

C

库:

libc = CDLL(libc_name)

libc 包含

C

标准库中的函数:

libc.printf

<_FuncPtr object at 0x0000000003CEE048>

调用这个函数:

libc.printf("%s, %d\n", "hello", 5)

9

这里显示的

9

printf

的返回值表示显示的字符串的长度(包括结尾的

'\0'

),但是并没有显示结果,原因是

printf

函数默认是写在标准输出流上的,与

IPython

使用的输出流不一样,所以没有显示结果。

C 数学库

找到数学库:

libm_name = util.find_library('m')

print libm_name

msvcr90.dll

调用

atan2

函数:

libm = CDLL(libm_name)

libm.atan2(1.0, 2.0)

---------------------------------------------------------------------------

ArgumentError Traceback (most recent call last)

in ()

1 libm = CDLL(libm_name)

2

----> 3 libm.atan2(1.0, 2.0)

ArgumentError: argument 1: : Don't know how to convert parameter 1

调用这个函数出错,原因是我们需要进行一些额外工作,告诉

Python

函数的参数和返回值是什么样的:

from ctypes import c_double

libm.atan2.argtypes = [c_double, c_double]

libm.atan2.restype = c_double

libm.atan2(1.0, 2.0)

0.4636476090008061

Python

数学库中的结果一致:

from math import atan2

atan2(1.0, 2.0)

0.4636476090008061

Numpy 和 ctypes

假设我们有这样的一个函数:

float _sum(float *vec, int len) {

float sum = 0.0;

int i;

for (i = 0; i < len; i++) {

sum += vec[i];

}

return sum

}

并且已经编译成动态链接库,那么我们可以这样调用:

from ctypes import c_float, CDLL, c_int

from numpy import array, float32

from numpy.ctypeslib import ndpointer

x = array([1,2,3,4], dtype=float32)

lib = CDLL()

ptr = ndpointer(float32, ndim=1, flags='C')

lib._sum.argtypes = [ptr, c_int]

lib._sum.restype = c_float

result = lib._sum(x, len(x))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值