当前位置: 首页 > 知识库问答 >
问题:

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

柴岳
2023-03-14

我正在为一个现有的代码库创建一个Python包装器,其中包含一个DLL和头文件。我用的是SWIG。

代码库有多个结构指针定义,如下所示:

typedef struct session* session_t;

在本例中,会话未在其他任何地方定义。DLL中的所有其他函数都将会话作为输入。如果我尝试在SWIG生成的代码中的任何地方引用session,我会得到session未定义的编译错误。我需要一种在Python代码中访问session\t值的方法。

我试过使用cpointer。i和pointer_函数是宏,但这不起作用,因为它假定输入类型不是指针。

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

typedef struct Session {} session, *session_t;

这可能行得通,但我找不到一种方法来使用SWIG。

如果结构指针的唯一定义是typdef结构指针,那么有没有办法通过SWIG访问它的值?

编辑:可能的修复方法是SWIG%ignore指令。可以忽略原始的struct def并在中替换它。我归档。

已解决(ish):我将Mark Tolonen的答案标记为正确,因为它包含许多有用的相关信息。我试图包装的API有很多已删除的构造函数和行为锁定了它的使用方式。我最终在它自己的命名空间中编写了一个C包装器,然后告诉Swig忽略除我的命名空间之外的所有内容。然后我只使用标准或我自己的类型与Swig/Python交互。

共有1个答案

孙承
2023-03-14

SWIG非常适合不透明类型。这是一个完整的例子,我提供了使用不透明typedef的test.dll的源代码。该结构仅在. c文件中定义,SWIG对定义一无所知。如果您仍然有问题,请使用可重现的示例更新您的问题。我怀疑您在某些typemap中使用了session而不是session_t,但如果没有可重现的示例,我只能表明它在没有定义的情况下工作。

测验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);
}

测验H

#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);

测试

%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)
>>>
 类似资料:
  • 问题内容: 我有用swig包装的类的C 代码。我无法修改代码或包装。在python中,我具有使用ctypes的指向所述C 类实例的指针。如何围绕该指针创建一个Swig包装器? 我知道swig对象拥有一个’this’属性,该属性在内部指向包装的对象,但是我找不到一种将其设置为我手头的指针的方法。 谢谢您的帮助! 问题答案: 您 可以 执行此操作,但是这需要大量工作,并且解决使ctypes或SWIG接

  • 我也在尝试在PHP中使用我的C类。在我的C代码中,我将typedef声明为: 所以我打算让SWIG在包装类中考虑我的typedef,我的接口文件如下: 在我的测试代码中,我将类型称为: 但我有以下错误: 附言:我的接口文件中也包含了“stdint.I”,但也出现了同样的错误 有什么想法吗?

  • 问题内容: 我正在尝试为C库编写SWIG包装器,该包装器使用指向其结构中函数的指针。我不知道如何处理包含函数指针的结构。下面是一个简化的示例。 test.i: 样本会议: 有人知道是否有可能让 t.my_func(1) 返回2吗? 谢谢! 问题答案: 我找到了答案。如果我将函数指针声明为SWIG“成员函数”,则它似乎可以按预期工作: 会议: 我希望不需要编写任何特定于SWIG的自定义代码(我希望仅

  • 问题内容: 我正在尝试将指针缠绕在go中。我这里有这段代码 和输出是 我想了解为什么我的InsertList方法根本没有引用节点指针指向其他结构 问题答案: 接收方通过值传递,就像其他参数一样,因此调用者看不到您在函数中所做的任何更改。如果要让函数修改函数外部存在的内容,则该函数需要处理指向该对象的指针。在您的情况下,是一个指针,但是您真正想要的是一个指向表示列表本身的对象的指针。例如:

  • 我使用这个代码: 定义: 我用命令构建它:,结果是: 警告:在“void*memcpy(void*,const void*,size_t)”调用中“大小”的参数与目标的指针类型“双*”相同;预期的“双倍”或显式长度 [-Wsizeof-指针-内存] 我不明白它是什么。你能告诉我如何使它正确工作吗?

  • 问题内容: 给定以下结构: 在结构中使用指针或值时,性能方面有何不同?是否有开销,或者这仅仅是两门Go编程课程? 我将使用指针来实现链接的结构,但这是我们唯一必须在结构中使用指针以获得性能的情况吗? PS:在上面的结构中,我们讨论了一个简单的int,但是它可以是任何其他类型(甚至是自定义类型) 问题答案: 使用对您的程序功能最有用的表格。基本上,这意味着如果将值设为有用,则使用指针。 从性能的角度