2015-07-18 2 views
0

Мне нужно расширить приложение C++ с помощью скриптов python, но я не уверен, какую библиотеку интерфейса я должен использовать. Основное сообщение: C++ app регистрирует некоторые методы класса для скрипта (чтобы они могли быть загружены как модуль в сценарии), а затем вызывает определенную функцию в скрипте python. Затем скрипт должен выполнить свою задачу, имея возможность вызвать методы C++. Когда сценарий закончен, приложение C++ должно использовать возвращаемое значение скрипта (например, как std :: list).Интеграция скриптов python в C++-приложении

Из того, что я читал, boost.python довольно мощный и, учитывая тот факт, что я уже использую boost, кажется, что это путь. Но в документации я не видел способа показать методы класса (статические или нет) для скрипта python.

Возможно ли это? Как я могу это сделать?

Edit:

Хорошо, я думаю, что я должен был быть немного более конкретно, извините. Я уже знаю о том, как импортировать библиотеки python и т. Д. В свой код на C++, и я ознакомился с документацией по расширению, но не получил того, что искал.

Для ясности, это рабочий процесс в моем сценарии:

  1. C++ приложение начинает работать
  2. В какой-то момент, класс C++ нуждается в поддержке конкретного питон скрипт, который находится где-то в определенном плагином -определение на жестком диске.
  3. Перед вызовом сценария класс C++ хочет выставить некоторые из его методов сценарию для обратных вызовов (сценарий должен только вызывать эти методы на этот раз, то есть когда сценарий завершил выполнение и будет вызван из другого места в C++-приложении он больше не сможет вызывать методы класса. Кроме того, я не хочу раскрывать весь класс сценарию - только конкретные методы и сценарий не должны создавать экземпляры класса Кроме того, я не хочу, чтобы другие скрипты python могли вызывать открытые методы, только тот, который я собираюсь вызвать.)
  4. После «регистрации» методов класса сценарию вызовы приложений C++ необходимую функцию в скрипте и получает возвращаемое значение как тип C++ (например, std :: list)

Я думаю, что третья точка является сложной частью здесь, и я понятия не имею, как я могу добиться этого ...

+2

Да, вы можете использовать Boost.Python для этого. Это называется «встраиванием», когда вы внедряете интерпретатор Python, а не расширяете там, где вы пишете модули Python на C++. Эти поисковые запросы помогут вам начать работу. –

ответ

0

Возможно ли это?

Абсолютно, да.

Как это сделать?

В самом общем смысле,

Импорт питона библиотеки с:

boost::python::object obj = boost::python::import("module_name"); 

объектов библиотеки доступа и подобъектов и функций с:

obj.attr("name"); 

Этого должно быть достаточно, чтобы получить вы идете - по мере того как вы получаете дальше, детали находятся в the documentation.

(Пример :)

auto calendar = boost::python::import("calendar"); 
auto leap = calendar.attr("isleap")("2015"); 
+0

Спасибо за комментарий, но это было не совсем то, что я ищу. См. Мой отредактированный вопрос. – KO70

Смежные вопросы