Как вызвать функцию Python на С++ с помощью SWIG?

У меня есть следующий С++

class myfun{
public:
    virtual double eval(arma::vec& x){};
};

double op(myfun* f, arma::vec& x){
    return f->eval(x);
}

где arma::vec — вектор броненосца C++, для которого я использую armanpy.i для перевода массива numpy в объект arma::vec и наоборот.

После включения директоров swig и создания интерфейса SWIG для приведенного выше кода C++ я создаю класс python, который переопределяет виртуальный метод eval:

class f(mymodule.myfun):
    def __init__(self):
        super(f,self).__init__()
    def eval(self,x):
        print x
        return 3.14

В python я сначала создаю экземпляр f, который наследует myfun:

b = f()

Затем я передаю это op:

mymodule.op(b,array([3.,4.]))

который выводит

<Swig Object of type 'arma::vec *' at 0x10e6dcc30>
3.14

Python не интерпретирует arma::vec * как пустой массив, как я думал, он делает это в файле armanpy.i. Любые идеи? Я не женат на arma::vec, и я мог бы заменить arma::vec пустым вектором.

Спасибо!


person Bluegreen17    schedule 28.03.2015    source источник


Ответы (2)


В вашем случае взгляните на armanpy, который предоставляет SWIG-файлы броненосца.

person squid    schedule 01.01.2016

Вы можете сделать это, используя этот репозиторий на Github, который использует armanpy и armadillo 8.500.1.

https://github.com/Wolframm74/armadillo_armanpy/blob/master/README.md

Начните с компиляции кода, следуя инструкциям, а затем опираясь на примеры. В нем есть примеры того, как переводить массивы Python numpy в массивы броненосцев через SWIG.

person wolfram74    schedule 18.10.2020