将C语言结构体传递给Python函数

4

我需要一种简单的方法将C结构传递给Python函数。我已经将Python嵌入到游戏服务器中,并打算用Python编写游戏逻辑。我在Google和邮件列表上搜索了很多,但没有找到有用的信息。我有一个复杂的C结构(包含指向其他相对复杂的结构的指针),并没有找到合理的方法来实现这一点。

我有这个结构:

struct client {
    int state;
    int sockfd;
    struct sockaddr_in *addr;
    struct epoll_event *epollev;
    struct buffer *in_buffer;
    struct buffer *out_buffer;
    struct packet *packet;
    struct player *player;
};

我需要将其传递给一个Python函数,以便我可以使用通用语法轻松访问成员(最好不要使用像字典之类的东西,尽管那也可以)。这几乎就像我需要一个PyObject_FromStruct函数或类似的东西。

有没有相对简单的方法来做到这一点?


我应该如何使用Cython传递一个结构体呢?我正在查阅文档,但找不到任何能够满足我的需求的工作示例。感谢您的时间。 - blakeman8192
4个回答

2

如果您可以在Python代码中将它们视为不透明的块,SWIG可以处理指针。

您还可以尝试使用Cython - 它是Python的一个方言,允许您混合使用Python和C数据类型。


0

你最好的选择是类似swig这样的工具,但我认为指针可能会给你带来麻烦。


感谢您的输入。我查看了它(在这里:http://www.swig.org/Doc1.3/Python.html#Python_nn19),但似乎我将遇到指针问题,而且它不起作用。我正在考虑是否应该使用Java编写游戏服务器并使用Jython,这将需要更少的“粘合代码”,但我真的很想要非抽象化C的性能和轻量级特性。 - blakeman8192

0

我认为最简单的方法可能是为结构中的每个元素编写get()/set()函数(例如:get_addr()获取地址值),然后:

选项1(我认为这是最简单的):将您的C代码编译为dll文件,其中包含导出的get/set函数,并将其加载到Python中调用“get”函数 (请查看我的帖子here以了解在Python中使用dll,此Q&A对于在Linux中使用.so文件可能有用)

选项2:您可以使用SWIG获取pyd文件并将其导入Python以调用“get/set”函数

使用这种方式,Python仅处理指针而不涉及任何内存地址使用。


是的,我认为这实际上是个好主意 - 在C中使用一些API来编写get/set函数,然后在Python中使用它们。有点笨重,但这是唯一无缝的方法。暂时将其标记为我的接受答案,除非有人能找到一个神奇的解决方案。 - blakeman8192

0
我会使用boost::python将结构体封装成Python可以理解的形式,然后访问你想要导出到Python的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接