在python中使用c语言编写的库
本文使用的 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 <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语言定义的函数
# 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接口,参考https://cffi.readthedocs.org/en/latest/installation.html
在python中使用c语言编写的库的更多相关文章
- (转)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 <stdio.h> 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中 ...
- Protobuf在Python中的应用(序列化数据)
1.了解Protobuf Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单.您可以定义数据的结构化,然后可 ...
- python中类似三元表达式的写法
python中没有其它语言中的三元表达式,如: a = x > y ? m : n; python中的类似写法为: a = 1 b = 2 h = "" h = " ...
随机推荐
- JQuery 选择器 xpath 语法应用
比如下面html代码 <ul> <li class="aaaa" title="ttt">li-1</li> <li ...
- 这款Office密码破解工具,无坚不摧!
你是否曾经陷入过这样的尴尬:因为忘记Word文档密码去找了一个Word密码破解工具,接着又忘记Excel文档密码去找了一个专门破击Excel的工具,那么如果忘记PowerPoint.Outlook.P ...
- linux中,通过crontab -e编辑生成的定时任务,写在哪个文件中
环境描述: 操作系统:Red Hat Enterprise Linux Server release 6.6 (Santiago) 内核版本:2.6.32-504.el6.x86_64 需求描述: 一 ...
- css图片宽高相等设置
<div class="image-header"> <img src="demo.jpg"> </div> .image- ...
- hive的初步认识与hive的本质
Hive是什么?就从这儿开始学习.... Hive是建立在Hadoop hdfs上的数据仓库基础架构. Hive可以用来数据抽取转换加载(ETL). Hive定义了简单的类SQL查询语句,称为HQL. ...
- oracle数据库字符集
Oracle字符集的基本原理 1. Oracle服务器字符集 oracle以哪种字符编码存储字符,可以通过以下语句查出数据库字符集的设置. 方法1 SQL> select * from v$nl ...
- 百度地图出现UnsatisfiedLinkError: Native method not found: com.baidu...
这是由于导入os文件方式引起 解决办法有两种: 第一种: 弄一个文件夹so/armeabi,把所有的so全部放进去.结构就是so/armeabi/a.so,b.so,c.so 然后压缩这个文件夹成为s ...
- <转>SVM实现之SMO算法
转自http://blog.csdn.net/zouxy09/article/details/17292011 终于到SVM的实现部分了.那么神奇和有效的东西还得回归到实现才可以展示其强大的功力.SV ...
- 广义表操作 (ava实现)——广义表深度、广义表长度、打印广义表信息
广义表是对线性表的扩展——线性表存储的所有的数据都是原子的(一个数或者不可分割的结构),且所有的数据类型相同.而广义表是允许线性表容纳自身结构的数据结构. 广义表定义: 广义表是由n个元素组成的序列: ...
- scss语法
SCSS其实就是SASS新语法, 增强了对CSS3语法的支持 1.变量(Variables) /*声明变明*/ $color: #333; $bgcolor:#f36; /*引用变量*/ body { ...