ctypes python_[python学习之路]ctypes,Python
ctypes
基本用法
ctypes
是一個(gè)方便
Python
調(diào)用本地已經(jīng)編譯好的外部庫(kù)的模塊。
from ctypes import util, CDLL
標(biāo)準(zhǔn) C 庫(kù)
使用
util
來(lái)找到標(biāo)準(zhǔn)
C
庫(kù):
libc_name = util.find_library('c')
# on WINDOWS
print libc_name
msvcr90.dll
使用
CDLL
來(lái)加載
C
庫(kù):
libc = CDLL(libc_name)
libc 包含
C
標(biāo)準(zhǔn)庫(kù)中的函數(shù):
libc.printf
<_FuncPtr object at 0x0000000003CEE048>
調(diào)用這個(gè)函數(shù):
libc.printf("%s, %d\n", "hello", 5)
9
這里顯示的
9
是
printf
的返回值表示顯示的字符串的長(zhǎng)度(包括結(jié)尾的
'\0'
),但是并沒(méi)有顯示結(jié)果,原因是
printf
函數(shù)默認(rèn)是寫在標(biāo)準(zhǔn)輸出流上的,與
IPython
使用的輸出流不一樣,所以沒(méi)有顯示結(jié)果。
C 數(shù)學(xué)庫(kù)
找到數(shù)學(xué)庫(kù):
libm_name = util.find_library('m')
print libm_name
msvcr90.dll
調(diào)用
atan2
函數(shù):
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
調(diào)用這個(gè)函數(shù)出錯(cuò),原因是我們需要進(jìn)行一些額外工作,告訴
Python
函數(shù)的參數(shù)和返回值是什么樣的:
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
數(shù)學(xué)庫(kù)中的結(jié)果一致:
from math import atan2
atan2(1.0, 2.0)
0.4636476090008061
Numpy 和 ctypes
假設(shè)我們有這樣的一個(gè)函數(shù):
float _sum(float *vec, int len) {
float sum = 0.0;
int i;
for (i = 0; i < len; i++) {
sum += vec[i];
}
return sum
}
并且已經(jīng)編譯成動(dòng)態(tài)鏈接庫(kù),那么我們可以這樣調(diào)用:
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))
總結(jié)
以上是生活随笔為你收集整理的ctypes python_[python学习之路]ctypes,Python的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 新版微信语音转发方法 萌妹子变声器手机版
- 下一篇: 齿轮计算机在线,齿轮参数计算器(萝卜花齿