这可能是我遗漏的简单问题,但我找不到任何解释。
给定一个在别处实现的抽象类及其由导出函数提供的接口(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/