Warten auf Nachricht von einer anderen Anwendung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
micha3
User
Beiträge: 5
Registriert: Mittwoch 28. November 2012, 13:51

Hallo,

In einer Anwendung wird ein Python-Script verwendet, um diese Anwendung zu automatisieren. Das Script kann innerhalb der Anwendung durch einen Mausklick gestartet werden. Das Script selber tut schon was es soll.
Nun möchte ich aber die ganze Anwendung von einem anderen selbstgeschriebenen C# Programm aus fernsteuern. Das heisst, mein C# Programm soll das Python Script in der anderen Anwendung starten. Diese Art von Fernbedienung ist aber in der anderen Anwendung nicht vorgesehen.

Meine Idee ist nun, das Python Script einmalig durch Mausklick zu starten, und dann soll das Script in einer Warteschleife auf eine Nachricht von meinem C# Programm warten. Wenn diese Nachricht kommt, dann soll der aktive Teil des Scripts ausgeführt werden, und danach soll sas Script wieder in die Warteschleife gehen.

Die Frage ist, wie man das realisieren könnte -- sowohl auf der Python Seite, wie auch auf der C# Seite.

Gruß
Michael
BlackJack

@micha3: Das Python-Skript könnte auf einem Port auf eine Verbindung warten. Entweder nur das, als Auslöser sozusagen, oder Du bastelst Dir da gleich einen RPC-Mechanismus dran. Bei JSON-RPC oder XML-RPC sollte die Programmiersprache eigentlich egal sein, da gibt es für jede Sprache was passendes.
micha3
User
Beiträge: 5
Registriert: Mittwoch 28. November 2012, 13:51

BlackJack hat geschrieben:@micha3: Das Python-Skript könnte auf einem Port auf eine Verbindung warten. Entweder nur das, als Auslöser sozusagen, ...
Das wäre sicherlich möglich, aber mit Ports und Messages kenne ich mich leider überhaupt nicht aus. Ich habe jetzt eine einfache Lösung gefunden:
Das C# Programm erzeugt in einem Verzeichnis eine leere Datei mit Namen "trigger". Das Python-Script prüft in einer Warteschleife, ob die Datei "trigger" existiert. Wenn ja, dann werden die entsprechenden Aktionen durchgeführt, die Datei "trigger" wird gelöscht und das Script geht wieder in die Warteschleife.

Ich habe noch eine weitere Frage:
Gibt es in Python sowas wie FileSystemWatcher in .NET? Damit könnte man ein Script schreiben, dass laufend ein Verzeichnis auf neue Dateien hin überprüft, und wenn dort ein neues *.py File auftaucht dann soll es ausgeführt werden.

Gruß
Michael
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Vielleicht solltest Du überlegen, ob Dein Python-Skript in IronPython (Python in .NET) besser aufgehoben ist. Damit kannst Du auf .NET-Komponenten zugreifen.

Mit CPython könntest Du mittels ctypes ReadDirectoryChangesW aus der WinAPI wrappen, um die Watcherfunktionalität zu erreichen. Evtl. gibts da was Vorgefertigtes im win32-Modul.

Generell finde ich die BlackJacks RPC-Idee besser. Ein Server ist mit Pythonmitteln schnell aufgesetzt: http://docs.python.org/2/library/simple ... erver.html
lunar

@micha3 Dann lerne Netzwerkprogrammierung.

Deine "Lösung" ist nicht gut. In einer Endlosschleife die Existenz einer Datei zu prüfen, verbraucht unnötig Ressourcen und hindert das System am Energiesparen. FileSystemWatcher löst das zwar, hat aber eigene Probleme (u.a. können Ereignisse verloren gehen, wenn sie zu schnell hintereinander auftreten).
micha3
User
Beiträge: 5
Registriert: Mittwoch 28. November 2012, 13:51

jerch hat geschrieben:Vielleicht solltest Du überlegen, ob Dein Python-Skript in IronPython (Python in .NET) besser aufgehoben ist.
Das geht in diesem Fall nicht, weil das Python-Script innerhalb einer vorhandenen Anwendung laufen muss. Ich kann mir nicht aussuchen welche Art von Python ich verwenden möchte.
jerch hat geschrieben:Generell finde ich die BlackJacks RPC-Idee besser. Ein Server ist mit Pythonmitteln schnell aufgesetzt: http://docs.python.org/2/library/simple ... erver.html
Habe mir den genannten Link mal angeschaut, bin aber leider _weit_ davon entfernt irgendwas davon zu verstehen.

Gruß
Michael
micha3
User
Beiträge: 5
Registriert: Mittwoch 28. November 2012, 13:51

lunar hat geschrieben:@micha3 Dann lerne Netzwerkprogrammierung.
Hast du einen Tip wo man das lernen kann, beginnend bei den einfachsten Grundlagen?

Gruß
Michael

P.S. Gibt es empfehlenswerte Bücher zum Thema Netzwerkprogrammierung? Habe zwar Erfahrungen in C, C++ und C#, aber keinerlei Vorkenntnisse was Netzwerkprogrammierung betrifft.
lunar

@micha3: Du verstehst wirklich nicht mal das Beispiel?!
micha3
User
Beiträge: 5
Registriert: Mittwoch 28. November 2012, 13:51

lunar hat geschrieben:@micha3: Du verstehst wirklich nicht mal das Beispiel?!
Nein, wirklich nicht. Ich habe keine Ahnung was das Beispiel tun soll oder wie man es testen würde. Was Netzwerk-Programmierung betrifft da brauche ich wirklich eine Anleitung oder ein Buch das bei Null beginnt.

Gruß
Michael
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Viel kürzer mit noch mehr Eklärungen geht wohl kaum. Warum kopierst du nicht das Beispiel und probierst es einfach mal aus?
Das Leben ist wie ein Tennisball.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich glaube, sein Problem ist vor allem, wie er jetzt aus C# heraus irgendetwas damit anstellen soll...

Hab hier ein vielleicht hilfreiches Beispiel gefunden: http://stackoverflow.com/questions/1583 ... rpc-server

Falls das nicht ganz klar ist: Die Idee, dass Python auf eine Nachricht wartet und dann etwas tut, solltest du verwerfen (oder zumindest, dass du ein solches Vorgehen selbst implementieren müsstest). Bei Verwendung des RPC-Protokolls ist es vielmehr so, dass C# als Client agiert - eben im Sinne der schon von dir erwähnten Fernbedienung - und die sozusagen nötigen "Tasten" mittels Methodenaufruf drückt. Der Methodenaufruf innerhalb von C# führt dann also dazu, dass Python etwas "auf Zuruf" tut und (falls nötig) das Ergebnis an den Client innerhalb von C# zurückliefert. Dieses Vorgehen ist zwar eigentlich für Zugriffe auf entfernte Systeme gedacht, aber "entferntes System" muss ja nicht zwangsläufig "anderer Rechner" heißen. ;)
Antworten