Не удается создать экземпляр класса C ++ в Python с помощью SWIG (ошибка Get Attribute) - PullRequest
0 голосов
/ 22 октября 2018

Я хотел экспортировать классы C ++ в Python, для чего я создал модуль расширения C ++, используя SWIG.Из документации видно, что классы можно экспортировать с помощью 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()

1 Ответ

0 голосов
/ 22 октября 2018

SWIG генерирует minimal_wrap.cxx и minimal.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

. Для справки см. 36.2.1 Запуск SWIG В Python SWIGдокументация.Цитата:

... [Running swig -c ++ -python] Это создает два разных файла;исходный файл C / C ++ example_wrap.c или example_wrap.cxx и исходный файл Python example.py.Сгенерированный исходный файл C содержит низкоуровневые оболочки, которые необходимо скомпилировать и связать с остальной частью вашего приложения C / C ++ для создания модуля расширения.Исходный файл Python содержит высокоуровневый код поддержки.Это файл, который вы импортируете для использования модуля.

...