4

我需要一种简单的方法将 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 函数,在该函数中我可以使用通用语法轻松访问成员(最好不要使用诸如 dicts 之类的东西,尽管这也可以)。这几乎就像我需要一个 PyObject_FromStruct 函数或其他东西。

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

4

4 回答 4

2

SWIG 可以做指针,尤其是当您可以在 Python 代码中将它们视为不透明的 blob 时。

您可能还会使用 Cython - 它是 Python 的一种方言,允许您混合 Python 和 C 数据类型。

于 2011-12-25T23:50:11.017 回答
0

你最好的选择是swig,但我认为这些指针会给你带来问题。

于 2011-12-25T21:59:52.790 回答
0

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

选项 1(我认为这是最简单的):将您的 c 代码编译为 dll 文件并导出 get/set 并将其加载到 python 中以调用“get”函数(查看我的帖子以在 python 中使用 dll,此问答可能有用用于在 linux 中使用 .so 文件

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

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

于 2011-12-27T10:18:41.503 回答
0

我会用 boost::python 将结构包装在 python 可以消化的东西中。然后访问要导出到 python 的功能。

于 2011-12-27T11:45:30.493 回答