У меня есть собственная библиотека, написанная на C ++, которую я сейчас работаю над расширением до Python. Я начал эту задачу, имея в виду Boost.Python, но я открыт для альтернатив.
В настоящее время у меня есть функция C ++, которая должна принимать экземпляр класса Python, а затем использовать методы этого объекта для выполнения определенных задач. Идея состоит в том, чтобы пользователю Python никогда не приходилось иметь дело с C ++. Ожидается, что они создадут этот объект Python из шаблона / примера класса Python, который я предоставлю, с предустановленными именами методов, которые, как я могу предположить, присутствуют в моей библиотеке C ++.
Интерфейс, доступный пользователю Python, выглядит так:
class Foo(object):
def __init__(self, args):
"""create an instance of this class with instance-specific attributes"""
def Bar1(self, a, b, c):
"""do something with the given integers a, b and c"""
pass
def Bar2(self, a, b, c):
"""do something else with the given integers a, b and c"""
pass
import mylib
cheese = mylib.Wine()
cheese.do_something(Foo)
В C ++ соответствующий код выглядит так:
#include <boost/python.h>
#include <Python.h>
class Wine {
public:
Wine() {};
~Wine() {};
static void do_something(boost::python::object *Foo) {
int a = 1;
int b = 2;
int c = 3;
Foo->attr("Bar1")(a, b, c);
Foo->attr("Bar2")(a, b, c);
};
};
BOOST_PYTHON_MODULE(mylib)
{
using namespace boost::python;
class_<Wine>("Wine")
.def("do_something", &Wine::do_something);
};
Я успешно скомпилировал этот код и убедился, что класс C ++ под названием Wine действительно доступен для Python, и я могу получить доступ к его функциям-членам. Если я напишу функцию-член с именем «greet ()», которая возвращает только «Привет, мир!», Она будет работать отлично.
Я должен подчеркнуть здесь важность передачи экземпляра Foo. У меня нет возможности просто импортировать модуль Foo в код C ++ и создать экземпляр Foo в C ++. Объект, который я хочу получить от пользователя Python, имеет атрибуты, которые мне нужно использовать, которые относятся к экземпляру, а не к самому классу.
Проблема в том, что я не могу понять, как передать экземпляр Python в do_something, чтобы он отображался в C ++ как вызываемый boost :: python :: object. Приведенный выше код возвращает следующую ошибку несоответствия сигнатуры C ++:
Boost.Python.ArgumentError: Python argument types in
Wine.do_something(Wine, Foo)
did not match C++ signature:
do_something(boost::python::api::object*)
Два дня поиска ответов в Интернете ни к чему не привели. Кажется, существует огромное количество информации о том, как передавать классы C ++ в Python, но мне не удалось найти информацию о том, как сделать это в обратном направлении. Был бы очень признателен за руководство здесь.
Спасибо!