gpt4 book ai didi

python - SWIG 如何包装缓冲区(字符数组)和从 C 到 Python 的指针?

转载 作者:太空宇宙 更新时间:2023-11-04 03:57:34 25 4
gpt4 key购买 nike

Swig 的手册让我有点困惑。我正在将我的 C 库包装到 python,以便我可以在 python 中测试我的 C 代码。现在我想知道如何在 Python 中访问 C 指针地址,例如,这是我的代码

typedef struct _buffer_t {
char buf[1024];
char *next_ptr;
} buffer_t;



void parse_buffer(buffer_t * buf_p) {
buf_p -> next_ptr ++;
}

我想做的是下面的 C 代码

buffer_t my_buf;
my_buf.next_ptr = my_buf.buf;
parse_buffer(&my_buf);
expect_equal(&(my_buf.buf)+1, my_buf.next_ptr);

如何在 Python 中做同样的事情?导入 SWIG 包装模块后,我在 python 中有了 buffer_t 类。

最佳答案

问题在于 SWIG 试图将缓冲区包装为 Python 中的字符串,而不仅仅是指针。 next_ptr 的合成赋值将分配内存并进行字符串复制,而不仅仅是指针赋值。您可以通过多种方式解决此问题。

最简单的就是使用%extend在Python中添加一个“reset buffer”的方法:

%extend {
void resetPtr() {
$self->next_ptr=$self->buf;
}
}

然后可以在 Python 中调用它来进行您想要的分配。

或者,如果您想强制将缓冲区视为另一个指针,您可以强制 SWIG 将两个成员视为 void* 而不是 char*字符[]。我曾希望这会像每个类型的 %apply 一样简单,但在我的测试中它似乎不能正确地用于 memberin 和 memberout:

%apply void * { char *next };
%apply void * { char buf[ANY] };

鉴于 memberin/memberout 类型映射对于完成这项工作至关重要,我认为 %extend 是迄今为止最干净的解决方案。

关于python - SWIG 如何包装缓冲区(字符数组)和从 C 到 Python 的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14990151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com