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
Warten auf Nachricht von einer anderen Anwendung
-
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.
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:BlackJack hat geschrieben:@micha3: Das Python-Skript könnte auf einem Port auf eine Verbindung warten. Entweder nur das, als Auslöser sozusagen, ...
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
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
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).
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).
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:Vielleicht solltest Du überlegen, ob Dein Python-Skript in IronPython (Python in .NET) besser aufgehoben ist.
Habe mir den genannten Link mal angeschaut, bin aber leider _weit_ davon entfernt irgendwas davon zu verstehen.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
Gruß
Michael
Hast du einen Tip wo man das lernen kann, beginnend bei den einfachsten Grundlagen?lunar hat geschrieben:@micha3 Dann lerne Netzwerkprogrammierung.
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.
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.lunar hat geschrieben:@micha3: Du verstehst wirklich nicht mal das Beispiel?!
Gruß
Michael
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.
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.
