1

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

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

我想从 python 调用 C 函数。

我想知道我必须在 python 中重建树的可能性,即使用引用结构在 C 代码中构建的树?

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

4

2 回答 2

1

Apache Thrift可能更适合您,它是 Facebook 为各种常见编程语言(包括 C++、Java、Python、Ruby 等)开发的二进制通信协议(更多详细信息,请参见其wiki 页面)。

您可能还对 Stackoverflow, Thrift 客户端-服务器多个角色中提出的以下问题感兴趣 ,其中包括客户端如何调用服务器中的函数。

编辑:由于 thrift 仅支持常见的原始类型、结构和三种容器类型(list<t1>、set<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 的信息,您可能会发现Thrift: The Missing Guide很有用。

于 2013-06-06T22:16:03.580 回答
1

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

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

于 2013-06-06T21:40:40.183 回答