将结构从python代码传递给C库

时间:2013-06-06 21:24:52

标签: python c

我有一个C库,我在其中定义了一个树结构:

struct node {
    int * info;
    struct node *left;
   struct node *right;
}

我想从python调用C函数。

我想知道我有什么可能在python中重建树,这是使用引用的结构在C代码中构建的?

我打算使用ctypes。我有更好的模块吗?

2 个答案:

答案 0 :(得分:1)

你可以查看cffi。它有点像ctypes,除了它比ABI级更多的API级别。 ctypes是ABI级别的。它也比ctypes年轻一点,并且还没有包含在CPython中。

您还可以尝试使用Cython,它允许您使用类似Python的语法非常自由地混合C符号和Python符号。您可以使用Cython从.pyx生成.c文件,其中.pyx有点像.py。当然,然后从.c创建一个.so并将其导入CPython。我使用m4从同一个文件创建纯python和cython - 它运行良好。

答案 1 :(得分:1)

Apache Thrift可能更适合你,这是一个由Facebook开发的二进制通信协议,用于各种常见的编程语言,包括C ++,Java,Python,Ruby等等(这里是它的wiki page } 更多细节)。

您可能也对Stackoverflow中提出的以下问题感兴趣, Thrift client-server multiple roles,包括客户端如何调用服务器中的函数。

编辑:由于thrift只支持常见的基本类型,结构和三种容器类型(列表< t1>,设置< t1>,map< t1,t2>),您需要使用指针。一种使用方法是使用id到实例映射。例如,您可以为每个节点分配唯一的ID,并使用id引用左侧和右侧节点,并使用int到节点映射来按ID获取节点。以下是节点结构的.thrift文件的外观:

struct Node {
  // a thrift struct is composed of fields;
  // each field has a unique integer identifier, a type, a name and an optional default value.
  1: required i32 nodeId;
  2: required i32 infoId;
  3: required i32 leftNodeId;
  4: required i32 rightNodeId;
}

对于用C语言编写并希望从python调用的函数,需要将它们打包到thrift服务中。这是你的功能服务可能看起来像(对不起,我在编辑这个答案时我不知道你的功能界面):

service TreeStructureService {
  void processTreeNode(1: Node node);
}

如果您想了解有关节俭的更多信息,可能会发现Thrift: The Missing Guide有用。