如何将Python中的bytes对象传递给包含Swig的C ++函数?

时间:2018-03-18 09:45:34

标签: python c++ swig

我在Python中有一个字节变量,我想传递给C ++函数,然后想要稍后返回字节,也可以通过C ++函数。 C ++代码包含在Swig中。有谁知道我怎么做或有一个基本的例子?我尝试使用void *作为C ++中的类型,但我无法使其工作。

C ++ example.hpp代码:

class MyTestClass {
public:    
    void set_data(void* data);
    void* get_data();

private:
    void* data;
};

C ++ example.cpp代码:

void MyTestClass::set_data(void* data)
{
    this->data = data;
}

void* MyTestClass::get_data()
{
    return data;
}

Swig界面文件:

/* File : example.i */
%module example

%include <std_string.i>

%{
    #include "example.hpp"
%}

%include "example.hpp"

测试Python代码:

from example import MyTestClass

test_class = MyTestClass()

data1 = b"test"
test_class.set_data(data1)

data2 = test_class.get_data()    
print(data2)

汇编:

swig -c++ -python -modern -py3 example.i
export CC=g++
python setup.py build_ext --inplace

错误:

Traceback (most recent call last):
  File "./test.py", line 6, in <module>
    test_class.set_data(data_1)
  File "example.py", line 119, in set_data
    return _example.MyTestClass_set_data(self, data)
TypeError: in method 'MyTestClass_set_data', argument 2 of type 'void *'

2 个答案:

答案 0 :(得分:1)

您应该使用char *而不是void *。 此外,您不应该使用

%include <std_string.i>

在example.i文件中,因为它具有将char *转换为字符串的typemap定义。

小问题:你们example.cpp应该#include&#34; example.hpp&#34;有一个MyTestCLass的定义。

答案 1 :(得分:0)

我设法使用cstring.i模板:

%cstring_output_allocate_size(char ** data_out,int * maxdata,NULL)

当我设置数据时,我也设置了大小,我用它来设置maxdata。第三个参数是NULL并且不是空闲的,因为数据只是一个参考。