在python C扩展中哪个python参数类型将被接受为char *

时间:2014-10-12 06:29:28

标签: python swig

我使用C ++编写了一个简单的Python扩展,如:

class Foo
{
   public:
     void Test(char* inbuffer);
};

我使用Swig在扩展名中生成包装器。

但我无法通过传递字符串或字节数组来测试此函数,如

myobj= foo.Foo()
keydata = "abcd"
myobj.Test(keydata)

我收到了错误:

  

TypeError:在方法'测试',参数2的类型' char *'

你有什么建议吗?

2 个答案:

答案 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。也许这个完整的例子可以帮助你弄清楚你的问题。

foo.i

%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