LINUX.ORG.RU

QtCreator C++/Python

 


0

2

Всем привет. Господа, кто знает, подскажите как можно в проектной файле *.pro Qt подключить исходники, модули на Python? Как вызывать функции питона в проекте на Qt/C++? Процесс сборки проекта написанный на C++ и Python?

Перемещено Klymedy из development

Какая интересная новость...

mittorn ★★★★★ ()
Ответ на: комментарий от Vsevolod-linuxoid

Спасибо... не часто прошу о помощи, забываю где как надо заводить тему.

charly_one ()
DISTFILES += my_shit.py

Вот, кажется, так подключаются файлы, которые собирать не надо, но с программой распространяются. Видимо это сработает во всяких OpenEmbedded и Buildroot-ах, надеюсь подтянутся в пакет, ведь никак py-файлы обрабатывать не нуно.

Дергать питонские скрипты из программы на C++, я для этого юзаю libpython, хотя вероятно есть и иные способы с разной степенью интеграции. Можно просто выполнять из libpython как строку в памяти, а можно и переплести на уровне объектов код на сях и питоне.

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 2)
Ответ на: комментарий от I-Love-Microsoft

HEADERS += \ widget.h \ mainwindow.h

SOURCES += \ widget.cpp \ mainwindow.cpp \ main.cpp

INCLUDEPATH += $$PWD/../../projects/BOOST/ INCLUDEPATH += /usr/lib/python3.5/config-3.5m-x86_64-linux-gnu INCLUDEPATH += /usr/include/python3.5/

LIBS += -L$$PWD/../../projects/boost_c++/BOOST/stage/lib/ -lboost_regex -lboost_system -lboost_numpy3 -lboost_python3 LIBS += -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu/ -lpython3.5m

DISTFILES += \ py1.py \

ругается на Py_Initialize() - не может подключить.

charly_one ()
Ответ на: комментарий от charly_one

Надо заголовочные файлы как-то перетасовать, либо добавить питонский хедер только в cpp файл. Я так делал:

#ifdef OS_WIN
#include <python3.5m/Python.h>
#else
#undef slots
#include <python3.4m/Python.h>
#define slots
#endif

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

попробую, он сволочь ругается на slots.

typedef struct{ const char* name; int basicsize; int itemsize; unsigned int flags; PyType_Slot *slots; /* terminated by slot==0. */ - на это поле ругается. } PyType_Spec;

PyAPI_FUNC(PyObject*) PyType_FromSpec(PyType_Spec*); #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 PyAPI_FUNC(PyObject*) PyType_FromSpecWithBases(PyType_Spec*, PyObject*); #endif #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03040000 PyAPI_FUNC(void*) PyType_GetSlot(PyTypeObject*, int); #endif

Хорошо, я попробую. Запарился, не знаю как решить... Спасибо за помощь.

charly_one ()
Ответ на: комментарий от I-Love-Microsoft

Не получается... В какие исходники нужно добавить <Python.h> чтобы конфликта не было со slots:

Прописать в классе с++, что запускает интерпретатор питон Py_Initialize(), в нем писать?

charly_one ()
Ответ на: комментарий от charly_one

Я честного говоря не знаю, наверное это прокатило у меня потому, что я делал всё это в одном C++-файле, не вынося это в заголовочники или объявления классов, и наверное лишь поэтому всё сработало. У тебя же более сложная ситуация, наверное придется искать другое решение. Сори.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Лады. Из примера, что мне товарищ отправил, я поправил про файл и у меня питоновские типы появились. Появилась возможность их выбирать, объявлять. Это хорошо. Я этого не знал. Какие либы нужно привязать и в какой последовательности, если конечно, последовательность имеет значение?! Есть ли там нюансы? С питоном никогда не возился, не приходилось привязывать к проекте на C++/Qt питон.

charly_one ()
Ответ на: комментарий от charly_one

Имеется ввиду линкер? Вообще без разницы, там только одна либа - libpython. Однако на офтопе приходится догонять еще рядом питонских dll-ок. Кроме того, для полной автономности сборок, чтобы оно работало на компах не нюхваших питон, требуется либо засунуть внушительный объем файлов, либо докладывать их вручную пока не заработает.

Но возможно я что-то делаю не так, раз приходится помимо libpython (и его so/dll), докидывать тонны других файлов... Всё это соблюдая PATH. Для офтопа bat-файл:

set PYTHONHOME=%CD%/python
set PYTHONPATH=%CD%/python
И туда всё сую.

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от I-Love-Microsoft

не линкер. В какой последовательности подключать библиотеки?

LIBS += -L$$PWD/../../projects/boost_c++/BOOST/stage/lib/ -lboost_regex -lboost_system -lboost_numpy3 -lboost_python3 -lboost_thread -lboost_timer -lboost_filesystem -lboost_locale -lboost_math_c99 -lboost_signals LIBS += -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu/ -lpython3.5m

LIBS += -L/usr/lib/x86_64-linux-gnu LIBS += -Wl, -Bstatic -lpython3.5m -Wl,-Bdynamic LIBS += -lz -lexpat -ldl -lutil LIBS += -lpython

charly_one ()
Ответ на: комментарий от charly_one

Тока щас заметил boost. Вот тут не знаю, с boost не применял. К тому же у мну qmake:

unix {
	LIBS += -lpython3.4m
	message("UNIX python 3")
}

win32 {
	DEFINES += OS_WIN
	INCLUDEPATH += c:/msys32/mingw32/include
	LIBS += -Lc:/msys32/mingw32/lib -lpython3.5m
	CONFIG += console
	message("WIN32 python 3")
}

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Понял, спасибо. Ну тоже самое, только еще boost для C++. Спасибо за помощь. Если разберусь напишу тебе. Всего доброго.

charly_one ()
Ответ на: комментарий от I-Love-Microsoft

Привет. Задача решена. Необходимо было заменить в исходниках slots: на Q_SLOT и в *.pro файл добавить следующую строку CONFIG += no_keywords С заменой slot на Q_SLOT парился. Теперь знаю. no_keywords - скорее всего было добавлено для работы с другими языками в проектах Qt/C++. Спасибо за помощь.

charly_one ()
Ответ на: комментарий от charly_one

Взаимно спасибирую, ибо эта инфа по Q_SLOT сейчас тоже была для меня полезна.

I-Love-Microsoft ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.