Seite 1 von 1
QT aus Python, übergreifende Funktionen
Verfasst: 3. März 2008 19:35
von AROK
Hallo Leute,
weiß Jemand von euch wie ich eine (gößere) Funktion, implementiert in C++ mit QT, aus Python aufrufen kann? So eine Art dll?
Leider hab ich überhaupt keinen Plan, wie man das machen kann. Wenn möglich solte das auch plattformunabhängig möglich sein.
Vielen Dank für eure Hilfe!
VG AROK
Verfasst: 3. März 2008 22:05
von Christian81
Verfasst: 4. März 2008 09:56
von franzf
Hi,
PyQt(4) hilft wohl nur bedingt. Denn deine Funktion ist ja bereits in C++ implementiert, oder sehe ich das falsch?
Dann geht das nicht so einfach. (PyQt(4) ist trotzdem nötig)
Da ich nicht genau weiß was du machen willst hier zwei Möglichkeiten:
1) Du fügst deinem Programm eine scripting-extension hinzu, damit du auf dein laufendes Programm per Python (Ruby, ...) zugreifen kannst. Dafür hilft dir SWIG weiter.
2) Du willst deine in C++/Qt geschriebenen Klassen aus Python heraus verwenden. Dann müssen deine Klassen als DLL verfügbar sein. Nun kannst du mittels sip (ebenfalls auf Riverbankcomputing erhätlich, oder eben über Portage

) Python-Bindings für deine Klassen erstellen.
Für beides sollte ausreichend Dokumentation verfügbar sein.
Für 1) kannst du dir mal
Canorus anschauen. Die erstellen mittels SWIG Extensions sowohl für python als auch ruby.
Viel Erfolg
Franz
Verfasst: 4. März 2008 18:15
von AROK
Hallo,
1) Du fügst deinem Programm eine scripting-extension hinzu, damit du auf dein laufendes Programm per Python (Ruby, ...) zugreifen kannst. Dafür hilft dir SWIG weiter.
2) Du willst deine in C++/Qt geschriebenen Klassen aus Python heraus verwenden. Dann müssen deine Klassen als DLL verfügbar sein. Nun kannst du mittels sip (ebenfalls auf Riverbankcomputing erhätlich, oder eben über Portage Wink) Python-Bindings für deine Klassen erstellen.
Hört sich gut an. Werde ich mir mal ansehen.
Vielen Dank und Grüße
AROK
Verfasst: 16. März 2008 15:06
von AROK
Hallo,
ich habe jetzt mal mein Programm als Shared-Object compiliert, und kann von Python heraus einzelne Funktionen aufrufen.
1) Du fügst deinem Programm eine scripting-extension hinzu, damit du auf dein laufendes Programm per Python (Ruby, ...) zugreifen kannst. Dafür hilft dir SWIG weiter.
aber wie kann ich denn das Programm starten und über Python steuern, wie du geschrieben hast? Dazu habe ich noch nichts gefunden.
Wenn ich das Programm aus Python heraus starte habe ich auch das Problem, dass QApplication.exec() natürlich erst zurückgibt, wenn das Programm geschlossen wird. Somit kann ich es so auch nicht fernsteuern. (oder gibt es eine Möglichkeit es asynchron zu starten)?
Viele Grüße
AROK
Verfasst: 18. Mai 2008 19:27
von AROK
Hallo,
die wichtigsten Funktionen habe ich inzwischen über SWIG unter Python zugänglich gemacht. Die Main Funktion wird in dem Fall dann garnicht gebraucht, die Rückgaben der Funktionen kann man über Python an andere Funktionen weitergeben. Das funktioniert alles ganz gut, das eigentliche Problem habe ich somit gelöst.
Aber nun habe ich einerseits das Programm mit dem die Nutzer interaktiv arbeiten können, und andererseits Python-Skripte die sie ausführen können, ohne jedoch die Ergebnisse "Live" zu sehen ("Nur" die Ergebnisdateien).
Daher wäre es jetzt noch interessant das Programm über Python quasi fernzusteuern und in Python mit dem laufenden Programm Daten auszutauschen.
Dazu habe ich leider bislang noch keine Idee. Hat von euch schon mal Jemand sowas gemacht?
Grüße
AROK
Verfasst: 19. Mai 2008 10:53
von RHBaum
Kenn mich mit Python in der beziehung ned so aus ....
Aber ein Programm/Script ueber eine dll/so erweitern ist eine sache, Ein Programm fernsteuern, eine ganz andere . das geht nicht mal von und zu c++ easy !
Dein programm muesste als erstes so gestaltet werden, das es (von aussen) befehle entgegen nimmt.
Dann muesstest du die Befehle "von Aussen" ins programm bekommen. "Von aussen" weil dein Script dann definitiv ein anderer Prozess ist.
Also brauchst IPC und nen passendes Protokoll dafuer.
Wenn dir Sockets recht sind, koenntest einfach RPC nehmen, dann haettest gleich nen prozudualen Aufbau, udn koenntest es aufs netzwerk erweitern.
Willst du es generell nur auf einem PC laufen lassen, und viel daten austauschen (performance) wuerde sich ne Pipe oder SHM anbieten.
Das ganze entwickelst am besten in ner dll (also den client fuer die fersteuerung) die dann per python einfach anziehst, so dass python fersteuern kann.
Fertige Loesungengibts auch paar. Unter Windows ist COM (ActiveServer in dem Fall) da das mittel der Wahl.
Plattformunabhaengig ist corba ... aber auch maechtig und alles andere als schlank (weiss ned obs da python support gibt fuer).
fuer KDE gabs mal dcop ... weiss ned was jetzt mittel der wahl ist ...
Auch ne Kommunikation ueber DBus waer denkbar .... weiss ned obs da fuer python ne anbindung gibt.
Ciao ...