python - 如何访问 SWIG Python 生成的抽象 c++ 类方法?

标签 python c++ swig

这可能是我遗漏的简单问题,但我找不到任何解释。

给定一个在别处实现的抽象类及其由导出函数提供的接口(interface):

class IFoo {
public:
    virtual ~IFoo(){}
    virtual void bar()=0;
};

extern IFoo* get_interface();

在 C++ 中,我会将其用作:

IFoo* foo = get_interface();
foo->bar();

如果我痛饮这个,我可以导入模块并将 get_interface() 分配给一个变量:

import myfoo
foo = myfoo.get_interface()

但我无法访问 foo.bar():

>>> foo.bar()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'SwigPyObject' object has no attribute 'bar'

我错过了什么?

谢谢!


如果上面的片段不够清晰,这里是完整的内容:

*.i 文件:

%module myfoo
#define SWIG_FILE_WITH_INIT

%include "myfoo.h"
%{
#include "myfoo.h"
%}

myfoo.h 头文件:

class IFoo {
public:
    virtual ~IFoo(){}
    virtual void bar()=0;
    virtual void release()=0;
};

extern IFoo* get_interface();

实现文件(myfoo.cpp)

#include "myfoo.h"
#include <iostream>

class Foo : public IFoo {
public:
    Foo(){}
    ~Foo(){}
    void bar();
    void release();
};

void Foo::bar() {
    cout << "Foo::bar()..." << endl;
}

void Foo::release() {
    delete this:
}

IFoo* get_interface() {
    return new Foo();
}

最佳答案

我发现了问题。我在生成 Ruby 扩展的构建系统中有这个。当我决定添加 Python 绑定(bind)时,我只是添加了一个新的 (Xcode) 目标来生成它,就像我为 Ruby 扩展所做的那样。我没有意识到的是,swig 还会生成一个包含所有初始化代码的 module.py 文件(与 Ruby 不同)。一旦我发现了这一点,我就简单地将生成的 python 文件与扩展动态库文件一起移动并导入它。现在一切正常。

我发现通过实际手动创建上面的 myfoo 代码(与运行我的构建系统相反,它完全忽略了额外的 myfoo.py 文件)。手动运行 swig 后,我注意到它不仅生成了 myfoo_wrapp.cpp,还生成了 myfoo.py。

感谢您的努力。为了将来引用,这与导演无关(我不是要创建双向界面)。它根本不知道 swig 生成的额外 python 初始化代码。

之前:

myfoo.i
myfoo.h
myfoo.cpp

>swig -c++ -python myfoo.i

之后:

myfoo.i
myfoo.h
myfoo.cpp
myfoo.py    <== Missed this one
myfoo_wrap.cxx

关于python - 如何访问 SWIG Python 生成的抽象 c++ 类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21460804/

相关文章:

python : function type parameter

python - 在 Flask 工作线程之间共享可变数据

c++ - 在 c++ : why push. 中将元素添加到空 vector 中可以正常工作,而 [] 不能

c++ - VC++调试未初始化变量的方法

python - 导入错误 : cannot import name 'set_random_seed' from 'tensorflow' (C:\Users\polon\Anaconda3\lib\site-packages\tensorflow\__init__. py)

python - 如何在保留顺序的同时从列表中删除重复项?

c++ - val != std::numeric_limits<double>::infinity() 或 !isinf(val) 或 isfinite(val)

python - Swig - 存储未知对象直到下一次调用 C++ 函数

c++ - 在 C++ 代码中释放 Python GIL

python - swig 无法找到 openssl conf