Найти - Пользователи
Полная версия: Встраивание Python скриптов в приложение на С++
Начало » Python для новичков » Встраивание Python скриптов в приложение на С++
1
akamda1989
Хочу использовать Python скрипты в своем приложении на С++. Имеется класс, которые позволяет управлять приложением. Оборачиваю его с помощью SWIG. Все работает. Не понимаю только как созданный объект класса из приложения передать в скрипт. Подскажите пожалуйста. Или я неправильно подхожу к проблеме.
doza_and
Гораздо проще использовать c++ в приложении на python. SWIG обычно используется когда нужно предоставлять интерфейс для многих скриптовых языков. boost_python будет попроще. а лучше всего обойтись ctypes.

akamda1989
Все работает. Не понимаю только как созданный объект класса из приложения передать в скрипт
Я вас тоже не понимаю. Как оно у вас работает если вы его не можете передать?

Экземпляр создается конструктором a=Ta().
Статические объекты тоже можно описать в swig.
В крайнем случае создайте и оберните функцию.
Ta& get_it();
тогда получите полный контроль над тем что отдаете.


akamda1989
Работает, в смысле могу создать экземляр класса в скрипте питона. Я это имел в виду.
А насчет ctypes поясните пожалуйста. Вообще не очень понял. Можно ли управлять внутренностью приложения питон-скриптом, как например js-скриптом? И может информации подкинете по теме этой. Много гуглил, примеров использвания одного в другом море, передачи строковых параметров тоже, а вот решения похожих задач ничего путевого не нашел.
doza_and
Встраивание питона в c и с в питон
http://docs.python.org/2/extending/

Конкретно интерпретация внутри приложения:
http://docs.python.org/2/extending/embedding.html
#include <Python.h>
int
main(int argc, char *argv[])
{
  Py_SetProgramName(argv[0]);  /* optional but recommended */
  Py_Initialize();
  PyRun_SimpleString("from time import time,ctime\n"
                     "print 'Today is',ctime(time())\n");
  Py_Finalize();
  return 0;
}
akamda1989
Можно ли управлять внутренностью приложения питон-скриптом, как например js-скриптом?

Да, конечно. Но если вы хотите управлять, то в приложении должны быть механизмы позволяющие управлять. Например в приложение должен быть встроен текстовый редактор, который позволит редактировать текст на питоне, кнопочки для выполнения, отладки, просмотра переменных и т.п.

В wxpython Для этого есть специальный компонент.

Посмотрите также http://rpyc.sourceforge.net/

Но стоит 10 раз подумать зачем вам приложение на c++? Достаточно динамической библиотеки. Сделайте питон главным и многие проблемы уйдут.
было:
int main()
{
....
}

стало:

int Main()
{
....
}
и вызывайте Main из питона. В чем будет для вас разница?

akamda1989
Разница в том, что уже есть достаточно большое приложение на С++ с Qt, немаловажным критерием является скорость работы. Есть кусочек приложения, который бы хотел вынести в скрипты для удобства. Вот принимаю решение - js или python. Посибо за ссылки, но это я уже и сам научился делать. Я не понимаю, как класс, с помощью которого можно управляеть приложением передать в скрипт. Класс я с помощью SWIG обернул для питона. Как передать объект этого класса из приложения на С++ в скрипт на Python?
Isem
Передайте указатель на объект, как дополнительный аргумент в вызываемой функции на питоне.
akamda1989
А можете пример показать? как я понимаю нужно мой класс преобразовать в PyObject*. Вот как это сделать?
Isem
Для передачи аргумента (указателя на C++ объект) в питоновскую функцию используйте преобразование:
PyObject * ptr = PyLong_FromVoidPtr(obj); // obj - указатель на объект

PyLong_FromVoidPtr() возвращает PyObject* (в нашем случае это указатель на C++ класс в виде длинного целого) , который можно передавать питону.

Для обратного преобразования (из PyObject*, который на самом деле есть длинное целое, представлющее указатель на С++ класс) делаете так:

ClassName * obj = (ClassName*) PyLong_AsVoidPtr( ptr ); // ptr - это PyObject* (наш указатель)

Если вам надо теперь вызвать конкретную функцию объекта С++, то вам необходима статическая функция-обертка для метода класса (своя для каждого вызываемого метода), которую будет вызывать питон, дополнительно передавая ей указатель на класс, а та, в свою очередь, будет вызывать сам метод класса для требуемого объекта, так как указатель известен.
akamda1989
Ясно. Спасибо большое!
Получается класс С++ и он же обернутый SWIG не являются идентичными?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB