在python中使⽤c语⾔编写的库
python被称为是“胶⽔语⾔”,号称能够“⽅便地”调⽤其他语⾔,⽐如c。但是实际操作中,对于⾮码农出⾝的⼈来说写语⾔接⼝还是很痛苦的事情。(我就从来没有试图去写过或者之类的⾼级货,⼀眼看去完全被吓到。)最近发现了⼀个python模块,“C Foreign Function Interface for Python”(),它把很多低层次的接⼝都隐藏起来,⽤户从⽽不需要写那些让⼈抓狂的接⼝⽂件也能⾮常⽅便的调⽤C语⾔了。(另外⼀种⽅便调⽤C语⾔的办法是使⽤],我有时间会在另⼀篇⽂章介绍。)
假设我有⼀个写好的C
// foo.c
#include <gsl/gsl_sf_bessel.h>
double foo(double a, double b){ return gsl_sf_bessel_J0(a + b); }
接下来,我们想在python中⽤cffi模块调⽤这个⽤C语⾔定义的函数foo的“签名”,即输⼊和输出的数据类型。
# demo_1.py
from cffi import FFI
ffi = FFI() ffi.cdef("double foo(double, double);")
下⼀步,我们要把函数foo.c这个源⽂件直接传递python 2. 把
# demo_1.py (cont.)
import os
file_dir = os.path.abspath('.') lib = ffi.verify("#include <foo.c>", include_dirs=[file_dir], libraries=['gsl', 'gslcblas'])
foo的定义的。它的⽤法是,⽤⼀个string直接告诉python,我要载⼊foo定义的C语⾔源⽂件。参数foo.c所在的位置。因为我把foo.c放在了同⼀个⽂件家⾥,所以我可以⽤foo.c的⽂件夹地址。最后,参数foo调⽤了GSL库⾥⾯的Bessel函数。这样就搞定了,我们可以在python中直接调
⽤C语⾔定义的函数
编程先学c语言还是python# demo_1.py (cont.)
a, b = 1.2, 3.4 print lib.foo(a, b)
之前说到第⼆种传递函数foo和其他⽤到的库⽂件⽐如GSL“打包”成⼀个新的库⽂件,⽐如叫libfoo.so⽽⽆需再指定其他库⽂件了。具体⽅法如下:
注意在这⼀步中我们把gsl和gslclbas这两个库⽂件“打包”进了
libfoo.so
了。
# demo_2.py
from cffi import FFI
ffi = FFI() ffi.cdef("double foo(double, double);") import os file_dir = os.path.abspath('.') lib = ffi.verify("#include <foo.c>", include_dirs=[dir],
library_dirs=[dir], libraries=['foo']) a, b = 1.2, 3.4 print lib.foo(a, b)
注意观察library_dirs⽤来说明库⽂件libfoo.so经常不在系统默认的gsl等库⽂件确实⼀般安装在libraray_dirs这个参数来指明)。 2. 参数[foo],⽽不是gsl和libfoo.so⾥⾯。
最后,假如函数foo.h来包含
// foo.h
#ifndef foo_h__
#define foo_h__
double foo(double, double); #endif
然后把该头⽂件传递过去就可以了,即
, include_dirs=[dir], library_dirs=[dir], libraries=['foo'])
配置CFFI接⼝,参考/en/latest/installation.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论