Python Embedding in C++

Gast #5439173
Lesenswert?

Ich bin grade dabei, in Qt eine Applikation zu schreiben, bei der der 
User die Möglichkeit haben soll, eine Art "Makro" selber schreiben zu 
können, um die Applikation nach eigenen Wünschen erweitern zu können. 
Dazu habe ich gelesen, dass man Python 'embedden' kann, also es wird der 
Python Interpreter statisch zu meiner Applikation dazu gelinkt, sodass 
man nur noch in einer Zip-Datei die Library mit liefern muss.

Die Idee habe ich von hier:

https://ubuverse.com/embedding-the-python-interpreter-in-a-qt-application/

Ich habe das nun nachzuvollziehen versucht. Im Moment arbeite ich unter 
Linux, aber am Ende soll meine Applikation auch unter Win laufen, was 
mir bisher gelungen ist, ich hoffe, dass dies mir auch mit Python 
gelingen wird ;-)

So, ich habe nun alles wie in meinem Link angegeben gemacht, und mein 
Code compiliert sauber und ohne Warnungen. Allerdings stürzt mein 
Programm ab, wenn ich

Py_InitializeEx(0);

ausführe, mit der Fehlermeldung:

Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: initfsencoding: Unable to get the locale encoding
zipimport.ZipImportError: can't decompress data; zlib not available

Was muss ich da ändern? ich verstehe das Problem nicht ganz. Da ich 
nicht dieses komische CSS-Programm aus dem Beispiel nutzen möchte, habe 
ich einfach den Lib-Ordner meines heruntergeladenen Python-Sourcecodes 
in eine Zip-Datei gepackt und zu meiner Applikation in den selben Ordner 
gelegt. Das müsste doch funktionieren?
Gast #5439564
Lesenswert?

So, ich habs jetzt geschafft, dass es nicht nur compiliert, sondern auch 
läuft. Ich kann sogar externe Python-Skripte aufrufen, sowie C++ 
Funktionen aufrufen und Werte austauschen, zumindest habe ich das schon 
getestet für ints und Strings.

Habe aber noch 2, 3 Fragen:

a) wie kann ich mit der C++ Applikation eine Liste zu Python 
austauschen, oder eine Liste aus Python als Rückgabewert erhalten? also 
z.B. den Returnwert von

def func:
  return [1, 2, 3]

in C++ dann auswerten?

b) wie bekomme ich es hin, dass mein Qt-Projekt immernoch 
plattformunabhängig ist, d.h. ich es unter Win und Linux compilieren 
kann? was muss ich da beachten? Ich denke, ich muss Python auch unter 
Windows dann noch compilieren und die .lib Datei erstellen und dazu 
linken, aber ich brauche ja auch noch zlib usw., was muss ich da alles 
beachten?
#5440615
Lesenswert?

Oleg schrieb:
> Habe aber noch 2, 3 Fragen:
>
> a) wie kann ich mit der C++ Applikation eine Liste zu Python
> austauschen, oder eine Liste aus Python als Rückgabewert erhalten? also
> z.B. den Returnwert von
>
> def func:
>   return [1, 2, 3]
>
> in C++ dann auswerten?

Das steht in der Dokumentation. ;-) Ansonsten:

https://www.boost.org/doc/libs/1_67_0/libs/python/doc/html/index.html

> b) wie bekomme ich es hin, dass mein Qt-Projekt immernoch
> plattformunabhängig ist, d.h. ich es unter Win und Linux compilieren
> kann? was muss ich da beachten? Ich denke, ich muss Python auch unter
> Windows dann noch compilieren und die .lib Datei erstellen und dazu
> linken, aber ich brauche ja auch noch zlib usw., was muss ich da alles
> beachten?

Du kannst ein fertiges Python für Windows benutzen, mußt es also nicht 
selbst übersetzen. Aber alle Libraries, die Dein C++- und Deine 
Python-Programme anziehen, müssen natürlich mitdeployt werden.
Gast #5442945
Lesenswert?

Hallo allerseits

so ich habe es geschafft. Habe meinem Qt-Projekt die Python-Library 
hinzugefügt, die Standard-Library wird als Zip geladen. Mein Code 
kompiliert sowohl unter Windows als auch unter Linux und läuft auf 
beiden Plattformen identisch. Ich kann Funktionen aus Python heraus 
aufrufen und Objekte zurück geben, und ich kann von Python heraus 
Funktionen in C++ aufrufen und Objekte an Python zurück geben. Aufrufe 
auf print() oder dergleichen aus Python drucken ihren Text in eine 
kleine Textbox auf meinem GUI aus. Es ist wahrlich kein Hexenwerk, wenn 
auch z.T. aufwendig.

Ich frage mich, ob es eine Möglichkeit gäbe, einen ganz einfachen 
Python-Interpreter in C++ zu schreiben, und diesen direkt in meinem 
Projekt hinzuzufügen, damit ich nicht zur Python-Library linken muss. 
Ich brauche im Prinzip nicht alle Fähigkeiten von Python, ich will nur 
so paar ganz einfache Sachen wie listen, Tupel und sowas verarbeiten 
können.

Ginge sowas wohl mit einigermassen vertretbarem aufwand? wie könnte man 
einen simplen Interpeter, der eine Python-Syntax nutzt, selber 
implementieren?
#5443122
Lesenswert?

Oleg schrieb:
> Ich frage mich, ob es eine Möglichkeit gäbe, einen ganz einfachen
> Python-Interpreter in C++ zu schreiben, und diesen direkt in meinem
> Projekt hinzuzufügen, damit ich nicht zur Python-Library linken muss.
> Ich brauche im Prinzip nicht alle Fähigkeiten von Python, ich will nur
> so paar ganz einfache Sachen wie listen, Tupel und sowas verarbeiten
> können.
>
> Ginge sowas wohl mit einigermassen vertretbarem aufwand? wie könnte man
> einen simplen Interpeter, der eine Python-Syntax nutzt, selber
> implementieren?

Lass es, das lohnt nicht. Du kannst schon sowas schreiben aber es wird 
einen Haufen Bugs haben. Du willst Python, nimm Python. Wenn dir Python 
zu groß ist, nimm, keine Ahnung, Lua oder so. Oder QtScript.
#7328752
Lesenswert?

Hallo, ich versuche auch Python in C++ einzubetten. Allerdings komme ich nicht gaz mit dem Tutorial klar. Ich erstelle mein Qt-Programm unter Windows und komme an folgender stelle nicht weiter.

https://ubuverse.com/embedding-the-python-interpreter-in-a-qt-application/

INCLUDEPATH += /usr/include/python3.4m LIBS += -L/usr/lib/x86_64-linux-gnu LIBS += -Wl,-Bstatic -lpython3.4m -Wl,-Bdynamic LIBS += -lz -lexpat -ldl -lutil

Python konnte ich mit Windows Pfaden ersetzen. Die folgende Libs sind mir allerdings ein Rätsel, wie ich diese verstehen und übersetzen kann damit sie funktionieren.

Hat jemand Verständnis für diese Befehle und kann sie mir erklären und ein synonym für Windows geben.

Mit freundlichen Grüßen

Maik

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren