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

将结构从python代码传递到C库,python,c,Python,C,我有一个C库,我在其中定义了一个树结构: struct node { int * info; struct node *left; struct node *right; } 我想从python调用C函数 我想知道在python中重建树的可能性是什么,它是在C代码中使用引号结构构建的 我打算使用。我有更好的模块吗?您可以查看cffi。它有点像ctypes,只是它更像API级别而不是ABI级别。ctypes是ABI级别。它也比ctypes年轻一些,并且还没有包含在CPyth

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

struct node {
    int * info;
    struct node *left;
   struct node *right;
}
我想从python调用C函数

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


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

您可以查看cffi。它有点像ctypes,只是它更像API级别而不是ABI级别。ctypes是ABI级别。它也比ctypes年轻一些,并且还没有包含在CPython中

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

可能更适合你,这是脸谱网开发的二进制通信协议,包括C++、java、python、露比……etc(更多详情,请参见下文)

您可能还对Stackoverflow中的以下问题感兴趣, ,其中包括客户端如何调用服务器中的函数

编辑:由于thrift仅支持常见的基本类型、结构和三种容器类型(列表、集合、映射),因此您需要使用指针。使用的一种方法是使用id来映射实例。例如,您可以为每个节点分配一个唯一的id,并使用id来引用左侧和右侧节点,还可以使用int-to-node映射来按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服务中。以下是您的函数服务的外观(抱歉,我在编辑此答案时不知道您的函数接口):


如果你想了解更多关于节俭的知识,你可能会发现它很有用。

ctypes是一种很好的方法,我从未使用过它。我现在就试试。我希望看看我是否有更好的解决方案,并希望看到一个最小的代码,使树的重建…不要开始学习通过建立树的类型。这就像在骑自行车之前学习驾驶喷气式战斗机一样。一点一点地提高你的技能。我需要从C代码过渡到python,我有一些困难。这就是为什么我在这里问:))。我对C和Python都很了解,但我现在需要从1传递到另一个。是的,我完全理解您需要知道的内容。我也知道怎么做。但我建议您学习如何使用ctypes传递简单的结构。然后逐步升级到包含指针的结构。如果你的树很大,那么也许你真的需要一个C扩展,因为C类型可能会变得混乱和昂贵。谢谢。你能提供几行代码,编译正确地用2个节点传输树吗?你好,@ Alin Soar,你可以找到更详细的例子来说明如何用.Cudio文件编写C++中的结构和函数。另外,您需要处理的一件事是,thrift中不支持指针类型。一种方法是为每个树节点创建一个ID,使用LeftNoNoDyID和RealthNoDyid ID,并在C++代码中维护一个int到节点映射,以找到正确的树节点。@ AlINSoAR,我已经为节点结构包含了一个示例节约代码和一个处理节点的C函数。
service TreeStructureService {
  void processTreeNode(1: Node node);
}