Seite 2 von 2
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Samstag 25. Juli 2015, 11:54
von schlangenbaendiger
jens hat geschrieben:Warum dann überhaupt die Trennung?!?
Weil die Tkinter-Anwendung noch anderes anzeigt/macht. Außerdem ist es doch sinnvoll, Anwendung nach ihren Aufgaben zu unterteilen und nicht alles in ein riesiges Skript zu packen.
Womöglich könnten sich ja auch noch unterschiedliche Einsatzgebiete ergeben, z.B. dass der SMTP-Server die Daten am Wochenende an ein anderes Programm sendet, oder so.
snafu hat geschrieben:@schlangenbaendiger: Module sind dir aber schon bekannt, oder?
Mehr oder weniger. An Module hatte ich auch zuerst gedacht, aber das war mir dann vom Bauchgefühl her nix, ob das so klappt mit Tkinter und Server-Funktionalität in einem.. ich habe nicht so das Fachwissen um das zu beurteilen. Also wollte ich das mehr getrennt haben in eigenständigen Skripten.
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Samstag 25. Juli 2015, 12:11
von snafu
schlangenbaendiger hat geschrieben:Aber dann wäre ja der SMTP-Server zu sehr an die Tkinter-Anwendung gebunden..
Der Server muss überhaupt nichts von einer TKinter-Anwendung wissen. Er sollte einfach nur eine API anbieten, aus der man die benötigten Daten weiterverwenden kann. Ob die jetzt in einer GUI-Anwendung, einem Terminalfenster, einer Webseite, einer Datenbank oder sonstwo landen, sollte dabei keine Rolle spielen.
Wenn es dir also "nur" um den Aspekt der losen Kopplung geht, dann benötigst du ganz sicher keine IPC für dein Vorhaben, sondern wohl schlichtweg zwei Module. Hierbei muss wie gesagt das Server-Modul nichts von den Modulen, die es benutzen (bei dir: die TK-App), wissen. Dies mittels Modulen umzusetzen, ist wesentlich leichter zu programmieren und zu warten anstatt den Weg über Prozesskommunikation zu gehen.
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Samstag 25. Juli 2015, 12:14
von DasIch
Den Teil mit dem smtp Server habt ihr aber schon mitbekommen oder? Aus Sicherheitsgründen macht es definitiv Sinn hier mehrere Prozesse zu verwenden.
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Samstag 25. Juli 2015, 12:22
von snafu
Da du ja noch einiges in deiner ursprünglichen Antwort editiert hast: Das Server-Modul kann auch ohne die TK-App aufgerufen werden. Du musst dafür lediglich ein Kommandozeilen-Interface (aka CLI) implementieren, d.h. den Aufruf mittels Shell-Befehlen ermöglichen.
Die TK-App basiert ja anscheinend unmittelbar auf dem Server-Skript. Sie sollte aber doch sinnvollerweise, da beides in Python programmiert ist, auch direkt mittels Python-Funktionsaufrufen den Server steuern bzw befragen können. Das macht man eben durch das Umschreiben des Codes als Modul.
Du wirst ja vermutlich irgendeine Struktur für die benötigten Daten haben. Baue diese Struktur mithilfe der Datentypen, die Python dir zur Verfügung stellt (z.B. Listen, Wörterbücher, etc). Greift man von Python aus auf das Modul zu, dann wird diese Struktur zurückgeliefert. Greift man von der Kommandozeile aus darauf zu, dann wird die Struktur in eine textuelle Ausgabe übertragen.
Bei letzterem kann einfach auf die Funktion mit der Python-Struktur aufgesetzt werden (d.h. dessen Rückgabe wird als Basis für die Shell-Ausgabe verwendet). Du müsstest also keinen doppelten Code schreiben. Du musst dir bloß ein paar Gedanken um das passende Design machen...

Re: Kommunikation zwischen zwei Prozessen
Verfasst: Samstag 25. Juli 2015, 12:28
von snafu
DasIch hat geschrieben:Den Teil mit dem smtp Server habt ihr aber schon mitbekommen oder? Aus Sicherheitsgründen macht es definitiv Sinn hier mehrere Prozesse zu verwenden.
Der Server ist aber doch eigentlich gar kein Server, sondern IMHO eher ein Client. Das "Server-Skript" wurde ja als etwas beschrieben, das irgendwelche Nachrichten von der FritzBox erhält und diese weiterverarbeitet. Wo siehst du da das Sicherheitsrisiko?
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Samstag 25. Juli 2015, 14:50
von schlangenbaendiger
@snafu: Ja, du hast sehr gute Ideen.. ich werde versuchen die Modul-Variante umzusetzen. Vielen Dank!
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Samstag 25. Juli 2015, 15:15
von jens
Wie wäre es die Daten in eine DB zu packen?
Hat man gleich eine Liste aller anrufe.
Beide Programme können dann auch zugreifen.
Die eine schreibt die andere liest ja nur.
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Samstag 25. Juli 2015, 15:49
von snafu
Nochmal bezüglich der Sicherheit. Falls es ein "echter" SMTP-Server ist, welcher wirklich nur gemäß dem SMTP-Protokoll arbeitet, dann gehört der durchaus aus Sicherheitsgründen in einen eigenen Prozess. Da gibt es aber auch fertige Tools, auf die ich an deiner Stelle vermutlich eher setzen würde als auf eine Lösung in Eigenarbeit. Jedenfalls sollte der SMTP-Server keine Aufgaben hinsichtlich der Datenaufbereitung (=Parsing) übernehmen. Dies kann man wirklich als normales Python-Modul implementieren und unabhängig von SMTP machen.
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Sonntag 26. Juli 2015, 08:58
von schlangenbaendiger
Wie ursprünglich von mir vermutet, habe ich bei den Modulen das Problem, dass entweder der Server oder nur die Tkinter-App geht. Jetzt müsste ich wohl mit Threads und Queues(?) das ganze steuern..?
Code: Alles auswählen
# smtp.py
# ...
def run():
foo = PushSMTPServer(('192.168.1.5', 8436), None) #localhost
print "Server gestartet"
try:
asyncore.loop()
except KeyboardInterrupt:
pass
Code: Alles auswählen
# tkinterapp
import smtp
# ...
root = Tk()
# ...
smtpserver.run() # hier liegt das Problem
root.after(1000,aktualisieren)
root.mainloop()
jens hat geschrieben:Wie wäre es die Daten in eine DB zu packen?
Bei einer Datenbank müsse ich ja auch wieder in einer Schleife ständig abfragen, ob es was neues gibt..
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Sonntag 26. Juli 2015, 09:55
von jens
EDIT:
i.d.R. bietet eine DB sowas wie inotify fürs Dateisystem... z.B. QSlite:
http://rogerbinns.github.io/apsw/connec ... updatehook
Sowas hab ich allerdings selbst noch nicht genutzt...
Aber mach es dir doch erstmal einfach und "poll" die datenbank oder dateisystem. Schnell gemacht und es läuft erstmal. Später kannst du dann immernoch sehen, das du von einem "polling" wegkommst.
schlangenbaendiger hat geschrieben:Jetzt müsste ich wohl mit Threads und Queues(?) das ganze steuern..?
Aufpassen mußt du bei Tkinter und anderen GUI Frameworks: Die mögen es nicht, wenn sie nicht der Haupt-Thread sind und von anderen threads manipuliert werden!