我有一个C库,我在其中定义了一个树结构:
struct node {
int * info;
struct node *left;
struct node *right;
}
我想从python调用C函数。
我想知道我有什么可能在python中重建树,这是使用引用的结构在C代码中构建的?
我打算使用ctypes。我有更好的模块吗?
答案 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有用。