c/c++开发分享SWIG – 将C字符串数组包装到python列表

我想知道使用SWIG将C中的字符串数组包装到Python列表的正确方法是什么。

数组在struct中:

typedef struct { char** my_array; char* some_string; }Foo; 

SWIG自动将some_string包装到python字符串。

我应该把什么放在SWIG接口文件中,以便我可以在Python中访问my_array作为常规Python字符串列表[‘string1’,’string2’]?

我使用了typemap作为sugested:

 %typemap(python,out) char** { int len,i; len = 0; while ($1[len]) len++; $result = PyList_New(len); for (i = 0; i < len; i++) { PyList_SetItem($result,i,PyString_FromString($1[i])); } } 

但那仍然行不通。 在Python中,my_array变量显示为SwigPyObject:_20afba0100000000_p_p_char。

我想知道是不是因为char **在一个结构中? 也许我需要告知SWIG那个?

有任何想法吗?

    我认为在SWIG中无法自动处理此转换。 您需要使用SWIG的Typemapfunction并手动编写类型转换器。 在这里,您可以找到从Python列表到char ** 您现在需要做的是检查Typemap的其余文档并将转换器从char **写入Python列表。

    我很抱歉略微偏离主题,但如果它是一个选项,我强烈建议使用ctypes而不是swig。 这是我之前在ctypes上下文中提到的一个相关问题: 将字符串列表传递给python / ctypes到C函数期望char **

    我不是这方面的专家,但我认为:

     %typemap(python,out) char** { 

    适用于返回char **的函数。 你的char **在一个结构中..看看swig生成的代码,以确认地图是否被应用。

    您可能必须使用以下内容:

     %typemap(python,out) struct Foo { 

    要有一个适用于返回的结构Foo的映射。

    背景:我使用了与您使用的相同的类型映射定义,但后来成功地使用了char **。

      以上就是c/c++开发分享SWIG – 将C字符串数组包装到python列表相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545311.html

      发表评论

      电子邮件地址不会被公开。 必填项已用*标注