代码之家  ›  专栏  ›  技术社区  ›  Geordie

如何使用SWIG/Python访问只有指针typedef的struct的值

  •  0
  • Geordie  · 技术社区  · 8 年前

    typedef struct session* session_t;
    

    在这个例子中, session 在其他任何地方都没有定义。DLL中的所有其他函数 session_t 阶段 在SWIG生成的代码中,任何地方都会出现编译错误 阶段 未定义。我需要一种方法来获取 在Python代码中。

    我想如果我能重新定义结构:

    typedef struct Session {} session, *session_t;
    

    这可以工作,但我找不到一个方法来做这个与SWIG。

    如果只有typdef结构指针的定义,那么有没有办法用SWIG访问结构指针的值?

    %ignore 指令。可能可以忽略原始的struct def并在.i文件中替换它。

    解决(ish):我把marktolonen的答案标记为正确的,因为它有很多有用的相关信息。我尝试包装的API有很多已删除的构造函数和行为,它们锁定了如何使用它。最后,我在自己的命名空间中写了一个C++包装,然后告诉SWIG忽略除了我的命名空间之外的所有东西。然后我只使用标准或我自己的类型来与Swig/Python接口。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Mark Tolonen    8 年前

    SWIG可以很好地处理不透明类型。下面是一个完整的示例,其中我提供了 test.dll .c session 而不是 session_t 在一些typemap中,如果没有可复制的示例,我只能说明它在没有定义的情况下工作。

    试验c

    #define API_EXPORTS
    #include <stdlib.h>
    #include "test.h"
    
    struct session {
        int a;
    };
    
    API session_t alloc(void) {
        session_t s = malloc(sizeof(session_t));
        if(s)
            s->a = 123;
        return s;
    }
    
    API int get_a(session_t s) {
        return s->a;
    }
    
    API void release(session_t s) {
        free(s);
    }
    

    #ifdef API_EXPORTS
    #   define API __declspec(dllexport)
    #else
    #   define API __declspec(dllimport)
    #endif
    
    typedef struct session* session_t;
    
    API session_t alloc(void);
    API int get_a(session_t s);
    API void release(session_t session);
    

    测试.i

    %module test
    %{
    #include "test.h"
    %}
    
    %include <windows.i>
    %include "test.h"
    

    测试会话

    Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (Intel)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import test
    >>> s = test.alloc()
    >>> test.get_a(s)
    123
    >>> test.release(s)
    >>>