无法确定从 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 例程的正确参数的主要内容,如果未能解决你的问题,请参考以下文章
python 和 ctypes 访问具有嵌套结构的 c++ 类