2014-11-20 6 views
6

Ich mache eine Qt Quick GUI-Anwendung (für Windows), die OpenGL und C++ für einige rechenintensive Sachen verwendet. Ich möchte Python-Code in die App einbetten, um Dinge zu tun, die in Python vergleichsweise einfacher sind.Einbetten von Python 3.4 in C++ Qt-Anwendung?

Grundsätzlich möchte ich nur die C++ - Code eine Funktion in einem Python-Skript aufrufen und lassen Sie das Skript den Job erledigen, dann speichern Sie die zurückgegebenen Daten in einer Variablen (String oder Float etc.) für die weitere Verwendung. Ich benutze Qt Creator, und ich habe Python3 Lib für MinGW Compiler. Ich habe versucht, etwas Code, aber es sieht aus wie python lib ist nicht ganz kompatibel mit Qt Creator. IS pyqt dafür verwenden wird eine gute Idee sein? Was wird der beste und einfachste Weg sein, dies zu tun?

EDIT: Dies ist der grundlegende Code, den ich ausprobiert habe, zuerst gab es mir einen Fehler, der sagt, kann pyconfig.h nicht finden. Dann habe ich einen INCUDEPATH zu meinem python34 include-Verzeichnis hinzugefügt.

#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(); 
} 

My .proDatei:

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 += 

Dann folgende Fehler:

C: \ Python34 \ include \ object.h: 435: Fehler: C2059: Syntaxfehler: ‚; "

C: \ Python34 \ include \ Objekt.h: 435: Fehler: C2238: Unerwarteter (n) Token vor ';'

C: \ Benutzer \ Amol \ Desktop \ TestWidgetApp \ main.cpp: 19: Fehler: C3861: 'PyString_FromString': Bezeichner nicht

gefunden
+1

Können Sie den Code, den Sie ausprobiert haben, anzeigen und erklären, warum er nicht funktioniert hat? – user3419537

+1

Meiner Meinung nach wäre es viel einfacher, die App in PyQt + PyOpenGL zu erstellen und bei Bedarf die Berechnung in einem C++ Modul durchzuführen. PyQt und PyOpenGL sind Wrapper um C++ - Code und werden daher nicht verlangsamt. Und wenn Ihre Berechnungen gemeinsame Routinen verwenden (z. B. lineare Approximation, Matrixmultiplikation usw.), die auch in C++ geschriebene Python-Bibliotheken enthalten, können Sie den gesamten C++ - Teil überspringen. – Fenikso

+3

RTFM [Einbetten von Python in eine andere Anwendung] (https://docs.python.org/3/extending/embbedding.html) –

Antwort

0

ich alle Qt-Code von Ihrem Beispiel entfernt und dann habe ich versucht, um es zu kompilieren (Qt hat nichts mit Ihrem Kompilierfehler zu tun). Und es kompiliert für mich. Der Unterschied war, dass ich die Include-Dateien von Python 2.7 verwendet.

Also habe ich ein wenig Suche nach der Zeichenfolge PyString_FromString in den Ordnern: C:\Python33\includes (Ich bemerkte Sie Python verwenden 3.4 und nicht 3.3, aber ich vermute, dies ist eine Sache 3.x ist) und C:\Python27\includes.

Ergebnisse:

Python 3,3

Searching string PyString_FromString in Python33's include folder

Python 2,7

Searching string PyString_FromString in Python27's include folder

So offenbar 3.4 Python ist nicht von Ihrem Boos unterstützt tPython-Version.

0

Python3 hat keine PyString_FromString Funktion. Python3 str Typ intern ist Unicode-Objekte mit komplexer Struktur.

Verwenden PyUnicode_FromString oder PyUnicode_FromStringAndSize zum Konstruieren str Objekt aus UTF-8 codierten C string (char*).

+0

Es gibt immer noch diese zwei Fehler: 'C: \ Python34 \ include \ object.h: 435: Fehler: C2059: Syntaxfehler: ' ; " ' C: \ Python34 \ include \ Objekt.h: 435: Fehler: C2238: Unerwartetes Token vor ';' " –

+0

Sind Sie sicher, dass Sie die richtige Python-Version im Kompilierungs-Toolset verwenden? Wie 'bjam target-os = windows/python = 3.4'? Oder definieren Sie mindestens 'PY_MAJOR_VERSION = 3' und' PY_MINOR_VERSION = 4'. –

2

Das Problem hier ist, dass Python 3.4 ein Strukturelement namens "slots" hat, (Dateiobjekt.h, in der typedef für PyType_Spec), die Qt aus unter Ihnen definiert, so dass Sie Dinge wie sagen kann:

public slots: 

in Ihrem Code. Die Lösung ist hinzuzufügen:

#undef slots 

kurz bevor Sie Python.h umfassen, und es neu zu definieren, bevor Sie etwas enthalten, die „Slots“ in der Art und Weise verwendet, dass Qt tut:

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

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

Ein bisschen von einem Hack (weil Sie auf eine bestimmte Definition von slots in Qt angewiesen sind), aber es sollte Sie in Fahrt bringen.

-1

Bewegen Sie

#include "boost/python.hpp" 

... sein, bevor Sie andere enthalten und es wird Ihr Problem zu lösen.

Das eigentliche Problem ist, wie Scott Deerwester in seiner Antwort beschrieben.