python - 最简单的python cffi示例
问题描述
我正在尝试使用 cffi 从 python 调用 ac 函数或 c 程序,但我发现大多数示例太复杂,无法轻松学习。我发现的最好的例子之一就是这个例子,我已经复制了它并制作了一个稍微简单的版本,我想在这里发布。
我将非常感谢对此示例的任何反馈,或者我希望有人可以制作一个更短、更简单的示例,在 python 中使用 cffi 来实现 API 外联和内联,甚至可能是一个超级简单的 ABI 示例。调用一个简单的添加函数是多么容易,这给我留下了深刻的印象,比从 Lua 调用 c 要容易得多。
所以它似乎有效,但我仍然不确定为什么,也不确定我的更复杂的真实示例的效果如何,因为我真的不知道我在做什么。顺便说一句,这是我编写或运行的第一个 python 程序。我的“你好世界”。我的目的是调用我从 python 脚本编写的 1000 行 c 程序,以便与 openlightspeed Web 服务器一起运行。
解决方案
我正在使用 Ubuntu 19.10。首先,我使用apt install python-pip安装了 Pip 。然后我用pip install cffi 安装了 cffi ,它也引入了 pycparser。然后我在我的主目录中创建了 4 个文件:add.c、add.h、build.py 和 add.py,如下所示:
添加.c:
#include "add.h" //if you don't have a header file you will get a warning
int addme(int a, int b)
{
return (a + b);
}
添加.h
int addme(int a, int b);
构建.py:
from cffi import FFI
ffibuilder = FFI()
ffibuilder.cdef("int addme(int a, int b);")
ffibuilder.set_source("pyadd",'#include "add.h"',sources=["add.c"])
ffibuilder.compile()
添加.py:
from pyadd.lib import addme
print(addme(2,6))
我输入了创建 pyadd.so 的python build.py,然后我可以将其导入到我的 python 脚本中。然后我输入了返回8的python add.py。set_source() 中的第一个参数是共享对象的名称,然后您将在 python 脚本中导入该名称。“from pyadd.lib import addme”和“from pyadd import lib”似乎都有效,但对于后者,您必须将 addme 称为“lib.addme”。这一定只是一个python的东西。
推荐阅读
- node.js - 到 IIS ASP api 的 gae nodejs 代理产生无效的 json 响应
- javascript - 将变量作为对象路径传递
- android - Google API 到 Artifact 库信息
- javascript - 异步/等待函数
- aws-glue - AWS Glue Crawler 不附加数据
- spring-boot - 千分尺无法将指标保存到弹性搜索,因为最终映射将具有超过 1 种类型:[_doc, doc]
- java - 在Java中,调试时,如何在堆中搜索所有对象以查找文本
- selenium - 我如何从
- javascript - 进入网页时播放声音
- c++ - Vulkan 默认情况下是否已经具有多线程?