无法确定从 SWIG(不是 ctypes)C 传递给 python 例程的正确参数

Posted

技术标签:

【中文标题】无法确定从 SWIG(不是 ctypes)C 传递给 python 例程的正确参数【英文标题】:Can't determine proper argument to pass to python routine from SWIG (not ctypes) C 【发布时间】:2016-05-17 15:11:55 【问题描述】:

我有一个相当简单的 C 例程,我想使用 SWIG 通过 Python 访问:

int routine(char *instring, char *outstring);

输入字符串刚刚传入,这似乎有效。 outstring 返回的是指向 C 例程中固定数组的指针,我的问题是如何使用 python 接口将 python 参数传递给它。

当我使用 python 时,我得到:

>>retstring = "foo"
>>retval = routine("Hello world", retstring)

这(显然)不起作用,因为当范围返回到提示级别时,值会丢失。但例行公事不会失败。问题是,我传入的任何 OTHER 参数都失败了,因为它不被视为 char *。

除了不返回字符串之外,该例程似乎正在运行。

我不知道该怎么办。我是否必须使用类型映射进行修改才能产生第二次返回?有没有例子可以说明这一点?

【问题讨论】:

ctypes return a string from c function的可能重复 您需要告诉我们更多关于routine 的信息,才能回答这个问题:您怎么知道分配给outstring 的空间有多大?通常,如果oustring 为空,则返回值会告诉您将其设为多大,或者大小有固定限制,但它也可能取决于instring 中的输入或任何其他可能的方案。 @Flexo :我不必分配 outstring。它是在例程中(静态地)预先分配的(是的,从线程的角度来看并不好)。我正在寻找 cstring.i,因为 SWIG 似乎对处理 C 字符串持怀疑态度。或 carrays.i,但 SWIG 表示不要将它们用于字符。 那是char** outstring 吗?因为如果它是静态分配的,那么您将无法使用您显示的函数参数返回它。您发布的答案看起来像是固定的 1024 字节,所以仍然不清楚。 它是例程中的静态(固定长度)字符串。只返回指向它的指针,包含答案。 【参考方案1】:

好的,我让它像这样工作(.i 文件):

%module example
%include cstring.i
%cstring_bounded_output(char *outcs, 1024);  // large magic number...
%
#include "routine.h"
%

int routine(char *instring, char *outcs);

然后调用(在 Python 中):

import example
retval, restring = example.routine("Hello World")

【讨论】:

以上是关于无法确定从 SWIG(不是 ctypes)C 传递给 python 例程的正确参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 SWIG 从 Python 向 C 传递和数组参数

Python:SWIG 与 ctypes

python 和 ctypes 访问具有嵌套结构的 c++ 类

SWIG / Lua:确定成员字段数据类型

使用 ctypes 将数组从 Python 传递到 C++,无法完全处理它

SWIG 的应用