2014-11-20 17 views
6

Sto realizzando un'applicazione Qt Quick GUI (per Windows), che utilizza OpenGL e C++ per alcune risorse computazionalmente intensive. Voglio incorporare il codice Python nell'app, per fare alcune cose che sono relativamente più facili in Python.Incorporare Python 3.4 in un'applicazione Qt C++?

Fondamentalmente, voglio solo il codice C++ per chiamare una funzione in uno script python e lasciare che lo script faccia il lavoro, quindi memorizzare i dati restituiti in una variabile (stringa, o float ecc.) Per ulteriore uso. Sto usando Qt creator, e ho ottenuto python3 lib per il compilatore MinGW. Ho provato un po 'di codice, ma sembra che python lib non sia abbastanza compatibile con Qt creator. Sta usando pyqt per questo sarà una buona idea? Quale sarà il modo migliore e più semplice per farlo?

EDIT: Questo è il codice di base che ho provato, prima mi ha dato un errore dicendo che non è possibile trovare pyconfig.h. Poi ho aggiunto un INCUDEPATH alla mia directory include python34.

#include "mainwindow.h" 
#include <QApplication> 
#include <boost/python.hpp> 


int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 
    using namespace boost::python; 

    PyObject *pName, *pModule, *pDict, *pFunc, *pValue; 

     Py_Initialize(); 

     pName = PyString_FromString(argv[1]); 

     pModule = PyImport_Import(pName); 


     pDict = PyModule_GetDict(pModule); 


     pFunc = PyDict_GetItemString(pDict, argv[2]); 

     if (PyCallable_Check(pFunc)) 
     { 
      PyObject_CallObject(pFunc, NULL); 
     } else 
     { 
      PyErr_Print(); 
     } 

     // Clean up 
     Py_DECREF(pModule); 
     Py_DECREF(pName); 

     Py_Finalize(); 

    return a.exec(); 
} 

mio .pro di file:

QT  += core gui 

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 

TARGET = TestWidgetApp 
TEMPLATE = app 

INCLUDEPATH += C:/boost_1_57_0 
INCLUDEPATH += C:/Python34/include 

SOURCES += main.cpp\ 
     mainwindow.cpp 

HEADERS += mainwindow.h 

FORMS += mainwindow.ui 

OTHER_FILES += 

Poi i seguenti errori:

C: \ Python34 \ includono \ object.h: 435: errore: C2059: errore di sintassi: '; '

C: \ Python34 \ include \ object.h: 435: errore: C2238: token imprevisti precedenti ";"

C: \ Users \ Amol \ Desktop \ TestWidgetApp \ main.cpp: 19: errore: C3861: 'PyString_FromString': identificatore non trovato

+1

Puoi mostrare il codice che hai provato e spiegare perché non ha funzionato? – user3419537

+1

Secondo me sarebbe molto più semplice costruire l'app in PyQt + PyOpenGL e se necessario eseguire il calcolo in un modulo C++. PyQt e PyOpenGL sono wrapper attorno al codice C++, quindi non rallentano. E se i tuoi calcoli usano routine comuni (ad esempio approssimazione lineare, moltiplicazione di matrici, ecc.), Che hanno anche librerie Python scritte in C++, puoi saltare l'intera parte C++. – Fenikso

+3

RTFM [Incorporamento di Python in un'altra applicazione] (https://docs.python.org/3/extending/embedding.html) –

risposta

0

Ho rimosso tutto il codice Qt dal vostro esempio e poi ho provato compilarlo (Qt non ha nulla a che fare con il tuo errore di compilazione). E si compila per me. La differenza è che ho usato i file di inclusione da Python 2.7.

così ho fatto un po 'di ricerca per la stringa PyString_FromString nelle cartelle: C:\Python33\includes (ho notato di utilizzare Python 3.4 e non 3.3, ma ho il sospetto che questa è una cosa 3.x) e C:\Python27\includes.

Risultati:

Python 3,3

Searching string PyString_FromString in Python33's include folder

Python 2.7

Searching string PyString_FromString in Python27's include folder

Quindi, a quanto pare, Python 3.4 non è supportato dal vostro Boos versione di tPython.

0

Python3 non ha la funzione PyString_FromString. Python3 tipo str internamente è oggetti unicode con struttura complessa.

Uso PyUnicode_FromString o PyUnicode_FromStringAndSize per costruire str oggetto da UTF-8 codificati C stringa (char*).

+0

Mi stanno ancora dando questi due errori: 'C: \ Python34 \ include \ object.h: 435: errore: C2059: errore di sintassi: ' ; '' ' C: \ Python34 \ include \ oggetto.h: 435: errore: C2238: token inattesi che precedono'; '' –

+0

Sei sicuro di usare la versione corretta di python nel set di strumenti di compilazione? Come 'bjam target-os = windows/python = 3.4'? O almeno definire 'PY_MAJOR_VERSION = 3' e' PY_MINOR_VERSION = 4'. –

2

Il problema qui è che Python 3.4 ha un membro struct chiamato "slots", (oggetto file.h, nella typedef per PyType_Spec), che definisce Qt da sotto in modo da poter dire le cose come:

public slots: 

nel codice. La soluzione è quella di aggiungere:

#undef slots 

poco prima di includere Python.h, e di ridefinire prima di includere qualsiasi cosa che utilizza "slot" nel modo in cui lo fa Qt:

#undef slots 
#include <Python.h> 
#define slots 

#include "myinclude.h" 
#include <QString> 

Un po ' di un hack (perché stai dipendendo da una particolare definizione di slots in Qt), ma dovrebbe farti andare.

-1

Spostare il

#include "boost/python.hpp" 

... per essere prima l'altra include e risolverà il problema.

Il vero problema è come descritto da Scott Deerwester nella sua risposta.