【问题标题】:combining ctypes and swig结合 ctypes 和 swig
【发布时间】:2011-10-25 08:45:52
【问题描述】:

我已经使用 SWIG 很长时间了 - 通常我喜欢它。 但是使用 ctypes 执行回调函数似乎(更)容易。

如何结合使用 C dll 交互的两种“方式”?

第一步是要知道,在已经通过导入相应的 SWIG 模块加载 dll 之后,如何将 ctypes 对象获取到 dll。

谢谢,
塞巴斯蒂安。

【问题讨论】:

    标签: python swig ctypes


    【解决方案1】:

    如果x.pyd是swig编译后的扩展模块,那么可以通过ctypes这样的方式加载dll:

    import x
    from ctypes import PyDLL
    dll = PyDLL(x.__file__)
    

    根据导出函数使用的调用约定,您可能需要使用 PyDLL、WinDLL 或 CDLL。

    【讨论】:

      【解决方案2】:

      缓冲协议可能是您最好的选择 (http://docs.python.org/c-api/buffer.html)。

      从 C 代码(例如 swig 生成的代码)中,您可以通过访问此接口获取指向底层 C 数据的指针。

      注意缓冲区接口有两个版本,python 2.x 中的 ctypes 对象将暴露旧协议,在 python 3.x 中它们会暴露新协议。

      您将不得不深入到 Python C API 级别,但只有一次,如果您将所有内容都包装好 - 例如,可能为任何支持缓冲区协议的内容创建一个返回 void* 的 %inline 函数,并在类型映射中使用它你的回调类型。

      【讨论】:

        猜你喜欢
        • 2019-12-24
        • 1970-01-01
        • 2017-05-02
        • 2013-02-28
        • 1970-01-01
        • 2023-03-08
        • 2020-07-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多