QT aus Python, übergreifende Funktionen

Verschiedenes zu Qt
Antworten
AROK
Beiträge: 16
Registriert: 26. April 2007 18:51

QT aus Python, übergreifende Funktionen

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
AROK
Beiträge: 16
Registriert: 26. April 2007 18:51

Beitrag 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
AROK
Beiträge: 16
Registriert: 26. April 2007 18:51

Beitrag 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
AROK
Beiträge: 16
Registriert: 26. April 2007 18:51

Beitrag 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
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Antworten