无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)

Cannot instantiate a C++ class in Python using SWIG (Gets Attribute error)

本文关键字:C++ 获取 属性 错误 实例化 SWIG Python      更新时间:2023-10-16

我想将C++类导出到 Python 中,为此我使用 SWIG 创建了一个C++扩展模块。从文档中,我可以看到可以使用 SWIG 导出类。我能够成功创建 python 的类模块(_minimal.pyd(。我可以在 Python 中导入模块。但是,我无法创建类的对象,并且出现属性错误。请找到我尝试过的代码示例。谁能帮我?

//minimal.h
class minimal
{
private:
static int num_instances;
public:
minimal()
{
++num_instances;
}
~minimal()
{
--num_instances;
}
void print_num_instances();
};
//minimal.cpp
#include <iostream>
#include "minimal.h"
int minimal::num_instances = 0;
void minimal::print_num_instances()
{
using namespace std;
cout << this->num_instances << endl;
}
//minimal.i(interface file)
%module minimal
%{
#include "minimal.h"
%}
%include "minimal.h"
//python code used to run the module
import _minimal as m
m1=m.minimal()

SWIG生成minimal_wrap.cxxminimal.py。 当你将.cxx文件构建到_minimal.pyd中时,你会import minimal,而不是import _minimal

>>> import minimal
>>> x=minimal.minimal()
>>> x.print_num_instances()
1
>>> y=minimal.minimal()
>>> x.print_num_instances()
2

有关参考,请参阅 SWIG Python 文档中的 36.2.1 运行 SWIG。 报价:

。[运行 swig -c++ -python]这将创建两个不同的文件;一个 C/C++ 源文件 example_wrap.c 或 example_wrap.cxx 和一个 Python 源文件 example.py。生成的 C 源文件包含需要编译并与 C/C++ 应用程序的其余部分链接以创建扩展模块的低级包装器。Python 源文件包含高级支持代码。这是您将导入以使用该模块的文件。