Kommunikation zwischen zwei Prozessen

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.
schlangenbaendiger
User
Beiträge: 8
Registriert: Mittwoch 22. Juli 2015, 16:24

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.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Den Teil mit dem smtp Server habt ihr aber schon mitbekommen oder? Aus Sicherheitsgründen macht es definitiv Sinn hier mehrere Prozesse zu verwenden.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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... ;)
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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?
schlangenbaendiger
User
Beiträge: 8
Registriert: Mittwoch 22. Juli 2015, 16:24

@snafu: Ja, du hast sehr gute Ideen.. ich werde versuchen die Modul-Variante umzusetzen. Vielen Dank!
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
schlangenbaendiger
User
Beiträge: 8
Registriert: Mittwoch 22. Juli 2015, 16:24

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..
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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!

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten