将C结构体传递给Python函数

4 投票
4 回答
2142 浏览
提问于 2025-04-17 09:00

我需要一个简单的方法,把C语言中的结构体传递给Python函数。我在一个游戏服务器中嵌入了Python,打算用Python来编写游戏逻辑。我在谷歌和邮件列表上找了很多资料,但都没有找到有用的信息。我在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的函数之类的东西。

有没有什么相对简单的方法可以做到这一点?

4 个回答

0

你最好的选择可能是像 swig 这样的工具,不过我觉得指针可能会让你遇到一些麻烦。

2

SWIG可以处理指针,特别是当你在Python代码中把它们当作不透明的块来使用时。

你也可以试试Cython,它是一种Python的变种,允许你把Python和C的数据类型混合在一起使用。

0

我觉得最简单的方法可能是为结构中的每个元素写一些获取和设置的函数,比如写一个叫 get_addr() 的函数来获取地址值。然后有两种选择:

选项一(我觉得这是最简单的):把你的 C 代码编译成一个 DLL 文件,并把获取和设置的函数导出,然后在 Python 中加载这个 DLL 文件来调用“获取”函数。你可以查看我在这里的帖子 关于在 Python 中使用 DLL 的内容,还有这个 问答 可能对在 Linux 中使用 .so 文件也有帮助。

选项二:你可以使用 SWIG 来生成 pyd 文件,然后在 Python 中导入这个文件来调用“获取/设置”函数。

通过这种方式,Python 只处理指向的内容,而不是指针本身,也不涉及任何内存地址的使用。

撰写回答