从Python解释器调用SWIG生成的代码

时间:2013-07-25 22:37:17

标签: c++ python swig interpreter

我正在尝试使用SWIG来尝试从Python调用C ++对象的成员函数。目前我有一个带有getter和setter的小示例类来修改C ++类的成员变量。这是C ++头文件:

#ifndef _square_
#define _square_
#include <iostream>

class Square
{
 private:
    double x;
    double y;
    const char *name;

 public:
    void setName(const char*);
    const char* getName();
    Square() {
        name = "construct value";
    };
};
#endif

这是.cpp实现文件:

#include <iostream>
using namespace std;
#include "Square.h"

const char* Square::getName()
{
    return name;
}

void Square::setName(const char* name)
{
    this->name = name;
    return;
}

SWIG的Square.i文件:

%module Square
%{
#include "Square.h"
%}

%include "Square.h"

SWIG似乎没有问题地生成Square_wrap.cxx文件,并且生成的目标文件似乎链接正常:

$ swig -python -c++ Square.i
$ g++ -c -fpic Square.cxx Square_wrap.cxx -I/usr/include/python2.7
$ g++ -shared Square.o Square_wrap.o -o _Square.so

现在举一些Python测试结果的例子:

$ cat test2.py
#!/usr/bin/python
import Square

s = Square.Square()

print s.getName()
s.setName("newnametest")
print s.getName()

如果我通过Python解释器运行它,一切正常:

$ python test2.py
construct value
newnametest

但如果我通过Python的CLI以交互方式输入测试行,那么事情就不起作用了:

$ python
Python 2.7.4 (default, Apr 19 2013, 18:28:01) 
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Square
>>> 
>>> s = Square.Square()
>>> 
>>> print s.getName()
construct value
>>> s.setName("newnametest")
>>> print s.getName()

>>> s.getName()
'<stdin>'
>>> s.setName('newnametest')
>>> s.getName()
''
>>> s.setName("newnametest")
>>> s.getName()
''

与CLI相比,Python处理Python脚本文件的方式有何不同,或者我是否滥用了SWIG生成的Python接口?任何有关如何调试或理解问题的提示都将非常感激。

1 个答案:

答案 0 :(得分:1)

据我所知,您只是将引用存储在cpp文件(this->name = name)上。复制它会很好,因为很有可能字符串不能持久,并且在函数返回后被丢弃(之后稍微收集垃圾)。这可以解释为什么在脚本中它可以工作(两个调用之间没有GCollection或其他任何东西)。

尝试使用strdup或使用std::string制作副本。