首页 > 解决方案 > 最简单的python cffi示例

问题描述

我正在尝试使用 cffi 从 python 调用 ac 函数或 c 程序,但我发现大多数示例太复杂,无法轻松学习。我发现的最好的例子之一就是这个例子,我已经复制了它并制作了一个稍微简单的版本,我想在这里发布。

我将非常感谢对此示例的任何反馈,或者我希望有人可以制作一个更短、更简单的示例,在 python 中使用 cffi 来实现 API 外联和内联,甚至可能是一个超级简单的 ABI 示例。调用一个简单的添加函数是多么容易,这给我留下了深刻的印象,比从 Lua 调用 c 要容易得多。

所以它似乎有效,但我仍然不确定为什么,也不确定我的更复杂的真实示例的效果如何,因为我真的不知道我在做什么。顺便说一句,这是我编写或运行的第一个 python 程序。我的“你好世界”。我的目的是调用我从 python 脚本编写的 1000 行 c 程序,以便与 openlightspeed Web 服务器一起运行。

标签: pythoncffi

解决方案


我正在使用 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的东西。


推荐阅读