Я хочу иметь возможность запускать скрипты Python в своем приложении, чтобы позволить автоматизировать вещи и модифицировать существующие объекты / вызывать методы существующих объектов.
В моем приложении есть класс BasicWindow
и класс MainWindow
, производные от первого. А пока при запуске приложения я инициализирую один экземпляр MainWindow
. Этот объект имеет много функций, среди которых есть одна, которая загружает файлы (LoadFile()
), и я буду использовать ее в качестве примера здесь.
Допустим, я хочу вызвать эту конкретную функцию (но не ограничиваясь этой функцией, это всего лишь пример функциональности, которую я хочу добиться с помощью Python) этого конкретного экземпляра объекта.
Этот метод не является статическим. Для этого я использую Boost.Python и создаю модуль следующим образом:
BOOST_PYTHON_MODULE(MyModule)
{
MainWindow::PythonExpose(); //not really sure how to operate here
//more stuff
}
Идея состоит в том, что я мог бы вызвать из Python что-то вроде:
MainWindow.LoadFile()
или даже лучше, просто:
LoadFile()
Одним из решений может быть создание статических функций в рамках приложения, а затем просто предоставление этих функций. В C ++ я мог найти конкретный экземпляр MainWindow
: (оба метода являются статическими)
void AppHelper::LoadFile()
{
GetMainWindow()->LoadFile();
}
void AppHelper::PythonExposeGlobal()
{
using namespace boost::python;
def("LoadFile", &AppHelper::LoadFile);
}
Возможно ли этого добиться? Общий вопрос: можно ли вызывать методы существующих объектов (в C ++) из Python? Если да, то как это сделать? Если нет, что я могу сделать, чтобы имитировать это поведение?
Например, я мог бы легко включить возможности сценариев в своем приложении C # и обмениваться экземплярами существующих объектов. (Но, конечно, у C # есть отражение).