我使用C ++编写了一个简单的Python扩展,如:
class Foo
{
public:
void Test(char* inbuffer);
};
我使用Swig在扩展名中生成包装器。
但我无法通过传递字符串或字节数组来测试此函数,如
myobj= foo.Foo()
keydata = "abcd"
myobj.Test(keydata)
我收到了错误:
TypeError:在方法'测试',参数2的类型' char *'
你有什么建议吗?
答案 0 :(得分:1)
您需要一个类型图。相反,您应该尽可能使用STL类,因为它们更好地映射到Python类型。例如,通过std::string
使用char*
代替%include std_string.i
:
%include "std_string.i"
class Foo
{
public:
void Test(std::string inbuffer);
};
注意:使用const std::string&
可能没有性能提升,因为包装器必须从Python字符串到C ++字符串进行复制。
答案 1 :(得分:0)
您的帖子中没有足够的信息。例如,这可以使用SWIG 2.0.12,Visual Studio 2012和Python 3.3。也许这个完整的例子可以帮助你弄清楚你的问题。
%module foo
%inline %{
#include <stdio.h>
class Foo {
public:
void Test(char* inbuffer) {
printf("%s\n",inbuffer);
}
};
%}
swig -c++ -python foo.i
cl /LD /Ic:\python33\include /Fe_foo.pyd foo_wrap.cxx -link /libpath:c:\python33\libs
Python 3.3.5 (v3.3.5:62cf4e77f785, Mar 9 2014, 10:35:05) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo
>>> f=foo.Foo()
>>> f.Test('abc')
abc