Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Python: Общие вопросы > Скриптуем С++ приложение |
Автор: Lеstat 28.7.2009, 16:25 | ||
Возникла задача добавить к приложению возможность выполнять скрипты. Для примера могу привести http://www.luxology.com/whatismodo/. Думаю в приложении любой контролл, виджет и т.д. отправляет команду с параметрами скриптовому движку для изменения чего-либо, получения данных и т.д. и получает результат выполнения этой команды. На данный момент прикрутил выполнение скриптов из С++ кода, но не понимаю как собрать все в кучу... Приведу очень простой пример: Вот короткая программа в которой я создаю Qt'ешное окно в С++, затем я хочу создать еще одно окно в моем же приложении, но на питоне. В коде видно, что создается новый экземпляр QApplication в питоне, и работа ведется уже с ним. Я считаю это неправильным. Я должен работать с app созданным в C++ коде. Мне нужно как-то передать указатель на экземпляр класса созданного в С++ в питон. Т.к. питон знает описание класса, например, Qwidget (т.к. подключен PyQt), то я смогу изменить заголовок окна window созданного в С++ коде... но проблема в том, что я не понимаю как передать указатель или реализовать это с помощью каких-нибудь других механизмов. Таким образом я не смогу связать С++ и питон. Просто выполняю скрипт из проги и все(
Насколько я понимаю, весь движок, приходится делать как С++'сный модуль питона, а exe'шка всего лишь выполняет запуск функции инициализации этой либы. Возможно ли вызывать методы уже созданных экземпляров классов в С++ коде из питона? Как связать экземпляры Qt'ешных классов созданных в С++ коде с питоном? Ведь и питон и С++ знают описания классов. Читал про py++, boost.python, swig. Все эти штуки требуют написания интерфейса, кроме пожалуй Py++... он вроде сам генерирует, но сделать с ним я ничего пока не смог. Допустим интерфейс создан и я могу питоновскими командами создавать/изменять/работать с объектами своей длл'ки из питона, но как взаимодействовать с объектами С++'сного кода? Объясните, пожалуйста, как вызвать метод окна window, созданного в С++ коде моего примера из питона. |
Автор: Amp 28.7.2009, 18:51 | ||
Да, тоже думаю, что надо обратить на QtScript внимание, раз приложение Qt-based. У самого руки все чешутся его пощупать ![]() |
Автор: Lеstat 28.7.2009, 19:55 |
Amp, powerfox, читал немного про Qt Script, но думаю нужно использовать питон. Приложение на самом деле на wxWidgets сейчас, просто когда Qt стала LGPL стал присматриваться в сторону Qt. Просто так взять и сразу все переписать на Qt с их скриптами довольно проблематично. Вобще не хотелось бы привязываться к Qt намертво. Программа предназначена для визуализации рассчетов. Скрипты в моем случае нужны не только для создания интерфейса, возможно даже в большей степени для того чтобы рулить движком визуализации. Сейчас чтобы настраивать все это дело нужно делать очень много менюшек, чтобы все подкручивать руками. Это не удобно. Настраивать некоторые вещи в коде намертво нежелательно. Выносить в конфигии тоже, мне кажется, не лучший вариант... а вот скрипты по аналогии с modo, 3dsmax, maya, всякими CAD'ами и т.д. было бы очень хорошим решением! Пока хочу получить возможность создавать/добавлять интерфейс приложения без компиляции всего проекта. Поэтому и начал возиться с Qt и PyQt. Пытаюсь сделаю некий шаблон проскриптованного интерфейса... Про Kross слышу в первый раз, посмотрю что за штука, Спасибо! |
Автор: powerfox 28.7.2009, 20:58 |
Это то, что вам нужно — 100%. Вопрос лишь в том, как это всё работает в винде (должно работать, KDE под виндой вполне нормально пашет), и в том, какие зависимости вы можете себе позволить (Kross может тянуть за собой kdelibs). Возможности Kross: http://techbase.kde.org/Development/Tutorials#Kross |
Автор: Lеstat 11.10.2009, 12:53 | ||||||||||||
powerfox, с кроссом так и не разобрался, немного продвинулся в другом направлении) Дублирую свой пост с другого форума... может тутор кому пригодится, да и мне кто поможет. Пытаюсь сделать поддержку приложением питоновских скриптов. На данный момент связал С++ классы с питоном использую http://www.swig.org/. Думаю информация будет полезной для сообщества, напишу подробнее о том как использовал http://www.swig.org/. Вот простой пример, исходники на С++: example.hpp
example.cpp
Для использования SWIG'а пишу example.i
Далее нужно сгенерировать исходники с помощью SWIG и откомпилировать их. Компилирую с помощью Visual Studio 2009 из командной строки. Для этого написал bat файл.
Теперь если выполнить
Как видим все работает! Далее мне хотелось бы использовать в питоне объкты, которые созданы и работают в С++ коде. Например, пишу такой main.cpp:
Вот теперь мне нужно передать указатель в питоновский скрипт, чтобы питон работал не с "x = example.A()" как в примере выше, а с уже созданным в C++ коде объектом cppx. Подскажите как их связать и возможно ли это вообще. Ведь питон теперь знает что такое класс A... он в модуле example. Спасибо! |
Автор: Lеstat 11.10.2009, 16:03 | ||||
Вот кое-какие продвижения, но с использованием http://www.boost.org/doc/libs/1_40_0/libs/python/doc/index.html На данным момент проблема, можно сказать, решена! В коде не все понятно, но работает! Вот исходник:
На выходе получаем:
Если кто-нибудь предложит вариант с использованием SWIG о котором я писал выше буду очень благодарен! |