python包合集-cffi
一、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的更多相关文章
- python包合集-argparse
一.argparse简介 argparse 是 python 自带的命令行参数解析包,可以用来方便的服务命令行参数,使用之前需要先导入包 import argparse 二.简单案例 简单使用,创建一 ...
- python包合集-shutil
一.简介 shutil是 python 中的高级文件操作模块,与os模块形成互补的关系,os主要提供了文件或文件夹的新建.删除.查看等方法,还提供了对文件以及目录的路径操作.shutil模块提供了移动 ...
- python知识合集
python安装包管理 http://www.cnblogs.com/wilber2013/p/4769467.html python pip安装源管理:pypi官网的源不太好,网速慢,容易造成包下 ...
- python资源合集
Python 官网: https://www.python.org/ Python2.7 doc: https://docs.python.org/2/ Python Package User Gui ...
- python 时间合集 一
**以下内容均为我个人的理解,如果发现错误或者疑问可以联系我共同探讨**#### python中4种时间表示形式:1.格式化时间字符串 2.时间戳 3.时间元祖 4.时间对象- string_time ...
- Python——模块合集
标准库模块 ● Python——OS(系统操作模块) ● Python——MD5(加密模块) ● Python——time(时间模块) ● Python——re(正则表达式) ● Python——sy ...
- Python爬虫合集:花6k学习爬虫,终于知道爬虫能干嘛了
爬虫Ⅰ:爬虫的基础知识 爬虫的基础知识使用实例.应用技巧.基本知识点总结和需要注意事项 爬虫初始: 爬虫: + Request + Scrapy 数据分析+机器学习 + numpy,pandas,ma ...
- 如何自学 Python(干货合集)
http://wenku.baidu.com/view/5108f974192e45361066f583.html
- python 练习合集一
一.运算符与流程控制 1.输入两个整数,打印较大的那个值2.输入三个整数,按照从小到大的顺序打印3.输入一个三位数,打印其个位.十位.百位上的数4.输入一个年份,判断是否为闰年,是打印一句话,不是打印 ...
随机推荐
- python之loggin模块与第三方模块
目录 logging模块详解 第三方模块 openpyxl模块 logging模块详解 主要组成部分 logger对象,用于产生日志 # 第一步,创建logger对象 logger = logging ...
- [CSP-S 2019 Day2]Emiya家今天的饭
思路: 这种题目就考我们首先想到一个性质.这题其实容易想到:超限的菜最多只有一个,再加上这题有容斥那味,就枚举超限的菜然后dp就做完了. 推式子能力还是不行,要看题解. 式子还需要一个优化,就是废除冗 ...
- React简单教程-3-样式
前言 在上一章 React 简单教程-2-ts 和组件参数 中我们新建的子组件 Displayer 没有样式,显得平平无奇,这一篇我们将给他美化一下. CSS 文件 一般的做法,是在你的组件级目录下新 ...
- .NET C#基础(7):接口 - 人如何和猫互动
0. 文章目的 面向有一定基础的C#初学者,介绍C#中接口的意义.使用以及特点. 1. 阅读基础 了解C#基本语法(如定义一个类.继承一个类) 理解OOP中的基本概念(如继承,多态) 2. ...
- python爬虫之JS逆向
Python爬虫之JS逆向案例 由于在爬取数据时,遇到请求头限制属性为动态生成,现将解决方式整理如下: JS逆向有两种思路: 一种是整理出js文件在Python中直接使用execjs调用js文件(可见 ...
- 在Winform开发中,使用Async-Awati异步任务处理代替BackgroundWorker
在Winform开发中有时候我们为了不影响主UI线程的处理,以前我们使用后台线程BackgroundWorker来处理一些任务操作,不过随着异步处理提供的便利性,我们可以使用Async-Awati异步 ...
- centos通过日志查入侵
1. Linux查看/var/log/wtmp文件查看可疑IP登陆 last -f /var/log/wtmp 该日志文件永久记录每个用户登录.注销及系统的启动.停机的事件.因此随着系统正常运行时间的 ...
- 论文解读(AGC)《Attributed Graph Clustering via Adaptive Graph Convolution》
论文信息 论文标题:Attributed Graph Clustering via Adaptive Graph Convolution论文作者:Xiaotong Zhang, Han Liu, Qi ...
- shell 同时执行多任务下载视频
本文为博主原创,转载请注明出处: shell 脚本不支持多线程,但我们需要用shell 脚本同时跑多个任务时怎么让这些任务并发同时进行,可以采用在每个任务 后面 添加一个 & ,让其在后台运 ...
- @RequestMapping注解的属性,将请求约束精细化
package com.atguigu.controller; import org.springframework.stereotype.Controller; import org.springf ...