本文使用的 cffi 官网网址:https://cffi.readthedocs.io/en/latest/overview.html
cffi 自己本身使用了pycparser 这个库,是用python编写的c语言parser库,官网地址: https://github.com/eliben/pycparser
python被称为是“胶水语言”,号称能够“方便地”调用其他语言,比如c。但是实际操作中,对于非码农出身的人来说写语言接口还是很痛苦的事情。(我就从来没有试图去写过ctype或者swig之类的高级货,一眼看去完全被吓到。)最近发现了一个python模块,“C Foreign Function Interface for Python”(cffi),它把很多低层次的接口都隐藏起来,用户从而不需要写那些让人抓狂的接口文件也能非常方便的调用C语言了。(另外一种方便调用C语言的办法是使用Cython],我有时间会在另一篇文章介绍。)
假设我有一个写好的C语言函数,定义在GSL(GNU Scientific Library)里面的Bessel函数。
// foo.c
#include
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 ", include_dirs=[file_dir], libraries=['gsl', 'gslcblas'])
foo的定义的。它的用法是,用一个string直接告诉python,我要载入foo定义的C语言源文件。参数foo.c所在的位置。因为我把foo.c放在了同一个文件家里,所以我可以用foo.c的文件夹地址。最后,参数foo调用了GSL库里面的Bessel函数。 这样就搞定了,我们可以在python中直接调用C语言定义的函数
# 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 ", 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接口,参考https://cffi.readthedocs.org/en/latest/installation.html
(转)python中调用R语言通过rpy2 进行交互安装配置详解
python中调用R语言通过rpy2 进行交互安装配置详解(R_USER.R_HOME配置) 2018年11月08日 10:00:11 luqin_ 阅读数:753 python中调用R语言通过r ...
如何在python中调用C语言代码
1.使用C扩展CPython还为开发者实现了一个有趣的特性,使用Python可以轻松调用C代码 开发者有三种方法可以在自己的Python代码中来调用C编写的函数-ctypes,SWIG,Python/ ...
Python中调用c语言(简单版)
Python中有时需要调用c程序中的函数.使用ctype库可以很方便地调用c语言.现说明方法,以及注意事项. c程序编译为.so文件: 我们需要的c语言文件为test.c,要从其中调用func(x,y ...
Python 中如何自动导入缺失的库?
在写 Python 项目的时候,我们可能经常会遇到导入模块失败的错误:ImportError: No module named 'xxx'或者ModuleNotFoundError: No modul ...
python中调用C++写的动态库
一.环境:Windows XP + Python3.2 1. dll对应的源文件(m.cpp): #include extern "C" { _de ...
VS2017中使用C++语言编写delay函数实现延迟
秒级别的延时 //定义函数 void delay(int sec){ time_t start_time, cur_time; // 变量声明 time(&start_time); do { ...
通过编写聊天程序来熟悉python中多线程及socket的用法
1.引言 Python中提供了丰富的开源库,方便开发者快速就搭建好自己所需要的应用程序.本文通过编写基于tcp/ip协议的通信程序来熟悉python中socket以及多线程的使用. 2.python中 ...
python中类似三元表达式的写法
python中没有其它语言中的三元表达式,如: a = x > y ? m : n; python中的类似写法为: a = 1 b = 2 h = "" h = " ...
python中实现三目运算
python中没有其他语言中的三元表达式,不过有类似的实现方法 如: a = 1 b =2 k = 3 if a>b else 4 上面的代码就是python中实现三目运算的一个小demo, 如 ...
随机推荐
SharePoint 2013 Designer系列之数据视图
在SharePoint使用中,数据展示是一块很重要的部分,很多时候我们会采用webpart的形式,但是有一些情况,我们不必使用开发,仅需使用Designer即可,下面让我简单介绍下数据视图的使用. 1 ...
AngularJS向指令传递数据
我今天要实现的功能是利用AngularJS来完成客户端过滤器. list.html页面主要代码如下: ......
NameValueCollection类
最近在研究HttpRequest类,发现里面的很多属性都返回一个NameValueCollection对象,今天再来了解一下这个神秘的对象. 随便写了个例子,发现跟HashTable类似.但是这个东西 ...
Leaflet学习笔记-基础内容
为什么选择Leaflet 开源,且代码仅有 31 KB,但它具有开发人员开发在线地图的大部分功能(80%的功能) 是不是比arcgis要小很多呢 官网:http://leafletjs.com/ 劣势 ...
Java将一个目录下的所有数据复制到另一个目录下
/* 将"C:\\JavaProducts\\Source"下的所有数据复制到"C:\\Target"下 */ import java.io.*; public ...
Mqtt服务器搭建
.bg { background: #99CC99 } Mqtt服务器搭建 测试环境:CentOS64位 1.安装基础软件 yum install gcc-c++ yum install cmake ...
SPOJ GSS(Can you answer the Queries)系列 7/8
GSS1 线段树最大子段和裸题,不带修改,注意pushup. 然而并不会猫树之类的东西 #include #define MAXN 50001 using n ...
Maven项目中添加JDBC驱动
在pom.xml配置文件中添加: mysqlmysql-con ...
ARMV8 datasheet学习笔记3:AArch64应用级体系结构之Memory Type and Attributes
1.前言 2. Memory类型和属性 memory分为normal memory和device memory,两种类型的Memory有各自的属性,除了下面介绍的几种属性外,还有其他一些杂项属性 2. ...
Musle比对软件
下载地址:http://www.drive5.com/muscle/downloads.htm 1)运行: win+R然后输入cmd,然后cd进入muscle目录 2) 比对: muscle3.8.3 ...