Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 2, 2012 23:11:07

akamda1989
Зарегистрирован: 2012-11-02
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Встраивание Python скриптов в приложение на С++

Хочу использовать Python скрипты в своем приложении на С++. Имеется класс, которые позволяет управлять приложением. Оборачиваю его с помощью SWIG. Все работает. Не понимаю только как созданный объект класса из приложения передать в скрипт. Подскажите пожалуйста. Или я неправильно подхожу к проблеме.

Офлайн

#2 Ноя. 3, 2012 08:21:06

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Встраивание Python скриптов в приложение на С++

Гораздо проще использовать c++ в приложении на python. SWIG обычно используется когда нужно предоставлять интерфейс для многих скриптовых языков. boost_python будет попроще. а лучше всего обойтись ctypes.

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

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




Отредактировано doza_and (Ноя. 3, 2012 08:23:32)

Офлайн

#3 Ноя. 3, 2012 09:52:17

akamda1989
Зарегистрирован: 2012-11-02
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Встраивание Python скриптов в приложение на С++

Работает, в смысле могу создать экземляр класса в скрипте питона. Я это имел в виду.
А насчет ctypes поясните пожалуйста. Вообще не очень понял. Можно ли управлять внутренностью приложения питон-скриптом, как например js-скриптом? И может информации подкинете по теме этой. Много гуглил, примеров использвания одного в другом море, передачи строковых параметров тоже, а вот решения похожих задач ничего путевого не нашел.

Офлайн

#4 Ноя. 3, 2012 18:04:22

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Встраивание Python скриптов в приложение на С++

Встраивание питона в 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 из питона. В чем будет для вас разница?



Отредактировано doza_and (Ноя. 3, 2012 18:09:35)

Офлайн

#5 Ноя. 4, 2012 11:11:04

akamda1989
Зарегистрирован: 2012-11-02
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Встраивание Python скриптов в приложение на С++

Разница в том, что уже есть достаточно большое приложение на С++ с Qt, немаловажным критерием является скорость работы. Есть кусочек приложения, который бы хотел вынести в скрипты для удобства. Вот принимаю решение - js или python. Посибо за ссылки, но это я уже и сам научился делать. Я не понимаю, как класс, с помощью которого можно управляеть приложением передать в скрипт. Класс я с помощью SWIG обернул для питона. Как передать объект этого класса из приложения на С++ в скрипт на Python?

Офлайн

#6 Ноя. 4, 2012 15:34:11

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Встраивание Python скриптов в приложение на С++

Передайте указатель на объект, как дополнительный аргумент в вызываемой функции на питоне.



Офлайн

#7 Ноя. 4, 2012 20:06:00

akamda1989
Зарегистрирован: 2012-11-02
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Встраивание Python скриптов в приложение на С++

А можете пример показать? как я понимаю нужно мой класс преобразовать в PyObject*. Вот как это сделать?

Офлайн

#8 Ноя. 5, 2012 17:02:05

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Встраивание Python скриптов в приложение на С++

Для передачи аргумента (указателя на C++ объект) в питоновскую функцию используйте преобразование:

PyObject * ptr = PyLong_FromVoidPtr(obj); // obj - указатель на объект

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

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

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

Если вам надо теперь вызвать конкретную функцию объекта С++, то вам необходима статическая функция-обертка для метода класса (своя для каждого вызываемого метода), которую будет вызывать питон, дополнительно передавая ей указатель на класс, а та, в свою очередь, будет вызывать сам метод класса для требуемого объекта, так как указатель известен.



Отредактировано Isem (Ноя. 5, 2012 17:11:10)

Офлайн

#9 Ноя. 5, 2012 20:06:12

akamda1989
Зарегистрирован: 2012-11-02
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Встраивание Python скриптов в приложение на С++

Ясно. Спасибо большое!
Получается класс С++ и он же обернутый SWIG не являются идентичными?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version