【问题标题】:Passing a C struct to a Python function将 C 结构传递给 Python 函数
【发布时间】:2011-12-25 21:45:08
【问题描述】:

我需要一种简单的方法将 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 函数或其他东西。

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

【问题讨论】:

  • 我将如何使用 Cython 来传递结构?我正在查看文档,但找不到任何我正在寻找的工作示例。感谢您的宝贵时间。

标签: python c python-c-api python-c-extension


【解决方案1】:

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

您还可以使用 Cython - 它是一种 Python 方言,可让您混合 Python 和 C 数据类型。

【讨论】:

    【解决方案2】:

    我认为最简单的方法可能是为结构中的每个元素编写 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只处理pointee NOT指针,不涉及任何内存地址使用。

    【讨论】:

    • 是的,我认为这实际上是一个好主意 - 在 C 中使用一些 API 使用 get/set 函数,然后将它们与 Python 一起使用。有点笨拙,但这是唯一无缝的方式。除非有人能找到神奇的解决方案,否则暂时将此标记为我接受的答案。
    【解决方案3】:

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

    【讨论】:

    • 感谢您的意见。我调查了它(这里:swig.org/Doc1.3/Python.html#Python_nn19),但似乎我会遇到指针问题,而且它不起作用。我正在争论是否应该用 Java 编写游戏服务器并使用 Jython,这将需要更少的“胶水代码”,但我真的在寻找非抽象 C 的性能和轻量级特性。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 2021-03-17
      • 2013-04-12
      • 2015-01-03
      • 2012-10-06
      • 1970-01-01
      相关资源
      最近更新 更多