Swig: директор C++/Python и std::vectorPython

Программы на Python
Ответить
Anonymous
 Swig: директор C++/Python и std::vector

Сообщение Anonymous »

Я пытаюсь обернуть код C++ в Python с помощью swig. Я использую инструкцию директора для перегрузки нескольких методов виртуального класса, но у меня есть некоторые проблемы с методами, которые должны возвращать табличные данные: std::vector или Eigen::Vector.
Скажем, у нас есть класс C++

Код: Выделить всё

class myCppClass
{
public:
myCppClass(){}
virtual std::vector compute_things();
};
Файл .i, обертывающий этот класс, выглядит так:

Код: Выделить всё

%module(package="example", directors="1", allprotected="1", "threads"=1) My_Example

%{
#include 
}

%import 
%include 
%include 
%import "numpy.i"

%feature("director") myCppClass;

%include 
Затем в Python

Код: Выделить всё

class myPythonClass(myCppClass):

def __init__(self):
super().__init__()

def compute_things(self):
return np.array([2.0, 1.0])

myclass = myPythonClass()
myclass.compute_things()

После того, как все скомпилировано, создание класса проходит успешно, но метод Compute_things() завершается с ошибкой без каких-либо сведений об ошибке.
Если я возвращаю int или a дважды все идет хорошо.
Я поместил несколько инструкций по обработке ошибок в файл .i, но ни одна из них не активирована.

Код: Выделить всё

%feature("director:except") {
if ($error != NULL) {
PyErr_Print();
if (PyErr_GivenExceptionMatches($error, PyExc_TypeError)) {
throw std::invalid_argument("director:except TypeError");
}
else {
throw Swig::DirectorMethodException("Unknown exception thrown by Python SWIG director method");
}
}
}

%exception{
try { $action }
catch (std::invalid_argument& exc) {
if (std::string(exc.what()) == "director:except TypeError") {
SWIG_exception_fail(SWIG_TypeError, "TypeError exception thrown by Python SWIG director method");
}
else {
std::string message = std::string("Exception '") + std::string(exc.what()) + "' thrown by C++ function : $fulldecl";
SWIG_exception_fail(SWIG_ValueError, message.c_str());
}
}
catch (Swig::DirectorMethodException& exc) {
SWIG_exception_fail(SWIG_UnknownError, exc.what());
}
catch (Swig::DirectorException &e) { SWIG_fail; }
catch (...) {
SWIG_exception_fail(SWIG_UnknownError, "Unknown exception thrown by C++ function : $fulldecl");
}
}

%include "exception.i"
%exception
{
try
{
$action
}
catch (const std::runtime_error& e) {
SWIG_exception(SWIG_RuntimeError, e.what());
}
catch (const std::invalid_argument& e) {
SWIG_exception(SWIG_ValueError, e.what());
}
catch (const std::out_of_range& e) {
SWIG_exception(SWIG_IndexError, e.what());
}
catch (...) {
SWIG_exception(SWIG_RuntimeError, "unknown exception");
}
}
Достиг ли я ограничений Swig или мне чего-то не хватает?
Большое спасибо за помощь.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ctordouble
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»