如何让Swig生成Python类而不是自由函数?

时间:2013-12-09 16:46:17

标签: c++ swig

如何让Swig生成Python代码而不是自由函数?

%module SimulatorAppWrapper
%{
#define SWIG_FILE_WITH_INIT
#include "SimulatorAppWrapper.hpp"
%}

%include "SimulatorAppWrapper.hpp"

我的包装器来源相当简单:

class SimulatorAppWrapper
{
public:

    typedef std::map<const char*, const char*> ConfigSettings;

    SimulatorAppWrapper();

    ~SimulatorAppWrapper();

    void AddConfigKey(const char* k, const char* v); 

    int Run();
};

从这里我生成Swig源并使用以下链接进行链接: swig -python -c ++ SimulatorAppWrapper.i

但是,我检查构建模块,我得到以下内容,我有自由函数而不是像类:

>>> import SimulatorAppWrapper
>>> dir(_SimulatorAppWrapper)
['SWIG_PyInstanceMethod_New', 'SimulatorAppWrapper_AddConfigKey', 'SimulatorAppWrapper_Run', 'SimulatorAppWrapper_swigregister', '__doc__', '__file__', '__name__', '__package__', 'delete_SimulatorAppWrapper', 'new_SimulatorAppWrapper']

我希望能够做到以下几点:

simApp = SimulatorAppWrapper
simApp.Run()

1 个答案:

答案 0 :(得分:1)

我看不出SWIG .i或你的.h。

有什么问题

但是你的测试将是simApp = SimulatorAppWrapper()(注意括号),然后是simApp.Run()之前的分号或新行。

此外,您应该使用from SimulatorAppWrapper import SimulatorAppWrapper,因为您已将模块命名为SimulatorAppWrapper

最后,dir(_SimulatorAppWrapper)中不需要下划线。您看到的列表是SWIG包装函数的集合,在您创建实例等时会调用它们。例如,当您调用SimulatorAppWrapper()时,这实际上会调用new_SimulatorAppWrapper()。请尝试dir(SimulatorAppWrapper)(原始代码中的dir()在模块对象上,但如果您使用上面建议的“from import”,那么您的课程将为dir()