一、cffi

  cffi是连接Python与c的桥梁,可实现在Python中调用c文件。cffi为c语言的外部接口,在Python中使用该接口可以实现在Python中使用外部c文件的数据结构及函数。

二、直接在python中通过cffi定义c函数并使用

  1、先通过pip3安装cffi :  pip3 install cffi

  2、编写测试代码:直接在 python 文件中 编写并执行 C语言代码

# test1.py 文件中

# 从cffi模块导入FFI
from cffi import FFI # 创建FFI对象
ffi = FFI() # 使用cdef创建C语言的函数声明,类似于头文件
ffi.cdef("int add(int a, int b);")
ffi.cdef("int sub(int a, int b);") #verify是在线api模式的基本方法它里面直接写C代码即可
lib = ffi.verify("""
int add(int a, int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
""") print(lib.add(1, 2))
print(lib.sub(1, 2))

  3、执行结果

root@ubuntu:~/test_cffi# python3 test1.py
3
-1

三、加载已有C语言代码并执行

  1、创建 test2.c 文件,并写如下代码,注意这是一个 .c 的文件

#include <stdio.h>

// 函数声明
int add(int a, int b);
// 函数定义
int add(int a, int b)
{
return a+b;
}
int mul(int a,int b);
int mul(int a,int b)
{
return a*b;
}

  2、创建 test3.py 文件,并在 test3.py 中调用 test2.c 文件

from cffi import FFI
ffi = FFI() # 就算在C语言的文件中定义了,这里在时候前还是需要声明一下
ffi.cdef("""
int add(int a, int b);
int mul(int a,int b);
""") #verify是在线api模式的基本方法它里面直接写C代码即可
lib = ffi.verify(sources=['test2.c'])
print(lib.add(1,2))
print(lib.mul(1,2))

  3、运行结果

root@ubuntu:~/test_cffi# python3 test3.py
3
2

四、打包C语言文件为扩展模块提供给其他 python 程序使用

  1、创建 test4.py 文件,其内容如下

import cffi

ffi = cffi.FFI() #生成cffi实例

ffi.cdef("""int add(int a, int b);""") #函数声明
ffi.cdef("""int sub(int a, int b);""") # 参数1:为这个C语言的实现模块起个名字,类似于,这一块C语言代码好像写在一个文件中,而这就是这个文件的名字,既扩展模块名
# 参数2:为具体的函数实现部分
ffi.set_source('test4_cffi', """
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
""") if __name__ == '__main__':
ffi.compile(verbose=True)

  2、 执行: python3 test4.py 执行过程如下

root@ubuntu:~/test_cffi# python3 test4.py
generating ./test4_cffi.c
the current directory is '/root/test_cffi'
running build_ext
building 'test4_cffi' extension
x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.5m -c test4_cffi.c -o ./test4_cffi.o
x86_64-linux-gnu-gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-Bsymbolic-functions -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 ./test4_cffi.o -o ./test4_cffi.cpython-35m-x86_64-linux-gnu.so
root@ubuntu:~/test_cffi#

  3、执行后多三个文件,分别是 .c, .o , .so 结尾的文件

  • test4_cffi.c
  • test4_cffi.cpython-35m-x86_64-linux-gnu.so
  • test4_cffi.o

  4、编写 test5.py, 在 test5.py 中使用test4_cffi 扩展模块,如下

from test4_cffi import ffi, lib

print(lib.add(20, 3))
print(lib.sub(10, 3))

  5、运行结果如下

root@ubuntu:~/test_cffi# python3 test5.py
23
7

  

python包合集-cffi的更多相关文章

  1. python包合集-argparse

    一.argparse简介 argparse 是 python 自带的命令行参数解析包,可以用来方便的服务命令行参数,使用之前需要先导入包 import argparse 二.简单案例 简单使用,创建一 ...

  2. python包合集-shutil

    一.简介 shutil是 python 中的高级文件操作模块,与os模块形成互补的关系,os主要提供了文件或文件夹的新建.删除.查看等方法,还提供了对文件以及目录的路径操作.shutil模块提供了移动 ...

  3. python知识合集

    python安装包管理  http://www.cnblogs.com/wilber2013/p/4769467.html python pip安装源管理:pypi官网的源不太好,网速慢,容易造成包下 ...

  4. python资源合集

    Python 官网: https://www.python.org/ Python2.7 doc: https://docs.python.org/2/ Python Package User Gui ...

  5. python 时间合集 一

    **以下内容均为我个人的理解,如果发现错误或者疑问可以联系我共同探讨**#### python中4种时间表示形式:1.格式化时间字符串 2.时间戳 3.时间元祖 4.时间对象- string_time ...

  6. Python——模块合集

    标准库模块 ● Python——OS(系统操作模块) ● Python——MD5(加密模块) ● Python——time(时间模块) ● Python——re(正则表达式) ● Python——sy ...

  7. Python爬虫合集:花6k学习爬虫,终于知道爬虫能干嘛了

    爬虫Ⅰ:爬虫的基础知识 爬虫的基础知识使用实例.应用技巧.基本知识点总结和需要注意事项 爬虫初始: 爬虫: + Request + Scrapy 数据分析+机器学习 + numpy,pandas,ma ...

  8. 如何自学 Python(干货合集)

    http://wenku.baidu.com/view/5108f974192e45361066f583.html

  9. python 练习合集一

    一.运算符与流程控制 1.输入两个整数,打印较大的那个值2.输入三个整数,按照从小到大的顺序打印3.输入一个三位数,打印其个位.十位.百位上的数4.输入一个年份,判断是否为闰年,是打印一句话,不是打印 ...

随机推荐

  1. 基于Python的渗透测试信息收集系统的设计和实现

    信息收集系统的设计和实现 渗透测试是保卫网络安全的一种有效且必要的技术手段,而渗透测试的本质就是信息收集,信息搜集整理可为后续的情报跟进提供强大的保证,目标资产信息搜集的广度,决定渗透过程的复杂程度, ...

  2. Vue2-Slot插槽使用

    Slot插槽 父组件向子组件传递 父组件将内容分发到子组件 slot插槽的值只读,不能在子组件中修改 slot插槽也可以作为组件之间的通信方式 默认插槽 父组件中:使用Son组件 <templa ...

  3. Caller 服务调用 - Dapr

    前言 上一篇我们讲了使用HttpClient的方式调用,那么如果我们现在需要更换为通过dapr实现服务调用,我们需要做哪些事情呢? Caller.Dapr 入门 如果我们的项目原本使用的是Caller ...

  4. 关于缓存一致性协议、MESI、StoreBuffer、InvalidateQueue、内存屏障、Lock指令和JMM的那点事

    前言 事情是这样的,一位读者看了我的一篇文章,不认同我文章里面的观点,于是有了下面的交流. 可能是我发的那个狗头的表情,让这位读者认为我不尊重他.于是,这位读者一气之下把我删掉了,在删好友之前,还叫我 ...

  5. vue 使用npm install安装依赖失败 【问题分析与解决】

    1 进入项目根目录,先通过 npm install 命令安装项目所需依赖,再通过 vue ui 命令打开 Vue Cli 提供的图形化界面,选择项目所在文件夹将项目导入. 出现问题 npm insta ...

  6. 基于SqlSugar的开发框架循序渐进介绍(9)-- 结合Winform控件实现字段的权限控制

    字段的权限控制,一般就是控制对应角色人员对某个业务对象的一些敏感字段的可访问性:包括可见.可编辑性等处理.本篇随笔结合基于SqlSugar的开发框架进行的字段控制管理介绍. 在设计字段权限的时候,我们 ...

  7. 利用kubernetes资源锁完成自己的HA应用

    Backgroud 前一章中,对kubernetes的选举原理进行了深度剖析,下面就通过一个example来实现一个,利用kubernetes提供的选举机制完成的高可用应用. 对于此章需要提前对一些概 ...

  8. 【数据库Mysql 查询当前时间,年月日】

    1.本年份 SELECT YEAR(now()) SELECT DATE_FORMAT(NOW(), '%Y') 2.本月份(例如:1.01.January) SELECT MONTH(now()) ...

  9. ASP.NET MVC-动态网页开发-宿舍管理系统

    很不容易,我在这两周为了数据库的课程设计第一次学习到了动态网页的开发.首先是尊重知识,也是为了知识不被忘记,在这里写下这第一篇博客.才疏学浅如果有什么理解错误,多包涵. 首先是环境的配置,我自己使用的 ...

  10. 要想不踩SaaS那些坑,得先了解“SaaS架构”

    摘要:围绕当下许多企业青睐的SaaS应用开发,华为云开发者技术服务工程师程泽在DTT首期带来主题为 <SaaS云原生应用典型架构> 的DTT首期直播分享. 本文分享自华为云社区<DT ...