Seite 1 von 2
Kommunikation zwischen zwei Prozessen
Verfasst: Mittwoch 22. Juli 2015, 16:34
von schlangenbaendiger
Hallo,
ich möchte gerne von einem aktiven Python-Programm mehrere Zeichenketten (insgesamt bis 100 Zeichen) zu einem anderen aktiven Python-Programm(in meinem Fall eine Tkinter-Anwendung) übermitteln.
Eigentlich eine klassische Client-Server-Beziehung, nur mit Sockets wollte ich nicht unbedingt arbeiten, da beide Programme sich auf dem selbem Computer befinden. Und eine Lösung wie "der Client schreibt die Daten in eine Datei und der Server prüft jede Sekunde die Datei auf neuen Inhalt" ist nicht unbedingt eine gute Lösung.
Ich hatte mich jetzt schon etwas mit Pipes auseinandergesetzt, konnte aber irgendwie noch nichts wirklich passendes/funktionierendes für meine Problemstellung finden.
Welche Lösungen gäbe es noch? DBus? SOAP?
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Mittwoch 22. Juli 2015, 16:47
von jens
schlangenbaendiger hat geschrieben:Und eine Lösung wie "der Client schreibt die Daten in eine Datei und der Server prüft jede Sekunde die Datei auf neuen Inhalt" ist nicht unbedingt eine gute Lösung.
Sofern das OS es unterstützt, kannst du dich auch benachrichtigen lassen. z.B. inotify unter linux...
Könntest du nicht auch das eine Programm vom anderen starten lassen? per
https://docs.python.org/3/library/multiprocessing.html ? Dann kannst du auch Nachrichten verschicken...
Ich weiß nicht, ob man die Beziehung, die es bei multiprocessing gibt, auch im Nachhinein aufbauen kann.
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Mittwoch 22. Juli 2015, 16:56
von Sirius3
@schlangenbaendiger: Pipes sind der richtige Weg für Interprozess-Kommunikation. Obwohl auch oft Sockets (AF_UNIX ist für lokale Kommunikation) eingesetzt werden.
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Mittwoch 22. Juli 2015, 18:34
von schlangenbaendiger
Die Sache mit den Sockets über AF_UNIX sah sehr vielversprechend aus, allerdings muss ich unter Windows arbeiten.
Zu Pipes oder Multiprocessing konnte ich bisher noch kein passenden Beispiel-Code finden..meist liegt das Ziel des Process ja in einer Funktion des Prozess, aber nicht in einem anderen Programm:
Code: Alles auswählen
from multiprocessing import Process, Pipe
def f(conn):
conn.send([42, None, 'hello'])
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
print(parent_conn.recv()) # prints "[42, None, 'hello']"
p.join()
Eigentlich will ich ja nur einen ganz einfachen Beispiel-Code.. hätte nicht gedacht, dass das so kompliziert wird was passendes zu finden.
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Mittwoch 22. Juli 2015, 18:48
von Dav1d
Es existieren
Named Pipes, unter Linux recht einfach via `os.mkfifo` zu erstellen, bei Windows muss man das ganze ein bisschen umständlicher via WinAPI machen. SOAP ist nicht IPC, D-Bus wieder nur Linux.
Wenn dein Programm die Tkinter-Anwendung startest könntest du einfach in stdin des anderen Prozesses schreiben und ihm mitteilen (z.B. durch das `USR1`-Signal), dass Daten vorhanden sind.
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Donnerstag 23. Juli 2015, 20:35
von darktrym
Wieso ist D-Bus nur Linux?
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Donnerstag 23. Juli 2015, 21:12
von BlackJack
@darktrym: Wirklich verbreitet ist D-Bus doch eigentlich nur unter Linux, oder? Das was zum Windowsport zu lesen ist klingt IMHO nicht vertrauenserweckend: „Everyone interested in having stable dbus on windows is invited to test the implementation, to reports bugs and/or to file patches.“
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Freitag 24. Juli 2015, 06:27
von noisefloor
Hallo,
es gibt ein Python-Modul namens PyPubSub (
https://pypi.python.org/pypi/PyPubSub/3.3.0), welche das bietet, was du suchst.
Benutzt habe ich selber das Modul aber noch nie.
Gruß, noisefloor
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Freitag 24. Juli 2015, 11:45
von MagBen
Ich habe dort und unter
http://pubsub.sourceforge.net/ nichts zu Inter-Prozess-Kommunikation gefunden, da sah alles nach Intra-Prozess-Kommunikation aus, ungefähr wie die Signals bei Qt.
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Freitag 24. Juli 2015, 16:03
von schlangenbaendiger
Dav1d hat geschrieben:Wenn dein Programm die Tkinter-Anwendung startest könntest du einfach in stdin des anderen Prozesses schreiben und ihm mitteilen (z.B. durch das `USR1`-Signal), dass Daten vorhanden sind.
Ich hatte mich jetzt die letzte Zeit nach diesem Vorschlag orientiert und folgendes zusammengebastelt:
Code: Alles auswählen
#!/usr/bin/python
import os
import signal
import subprocess
import time
proc = subprocess.Popen(['python', 'child.py'],stdin=subprocess.PIPE)
time.sleep(1)
os.kill(proc.pid, signal.SIGUSR1)
time.sleep(5)
proc.communicate('Hallo Welt')
Code: Alles auswählen
#!/usr/bin/python
import os
import signal
import time
import sys
def signal_usr1(signum, frame):
input = sys.stdin.readline()
sys.stdout.write('Bekomme: %s'%input)
signal.signal(signal.SIGUSR1, signal_usr1)
time.sleep(3)
Verwendete Quellen:
http://pymotw.com/2/subprocess/
https://jimmyg.org/blog/2009/working-wi ... .html#id17
Als Beispiel funktionierte das auf meinem Linux-Computer, der Test unter Windows steht heute Abend noch aus.
Vielleicht hat jemand noch Verbesserungsvorschläge für den Beispiel-Code oder eine elegantere Variante?
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Freitag 24. Juli 2015, 16:33
von jens
Wenn du das andere programm mittels subprocess startest, könntest du dann nicht gleich auch multiprocessing nehmen?!?
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Freitag 24. Juli 2015, 18:31
von schlangenbaendiger
jens hat geschrieben:Wenn du das andere programm mittels subprocess startest, könntest du dann nicht gleich auch multiprocessing nehmen?!?
Ich habe leider keine Ahnung von Multiprocessing. Hat jemand ein passenden Beispiel-Code dafür?
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Freitag 24. Juli 2015, 18:56
von jens
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Freitag 24. Juli 2015, 19:31
von Dav1d
Ich denke nicht, dass `multiprocessing` die richtige Lösung ist. Nur weil ein Programm, welches du starten möchtest, zufällig in Python geschrieben ist, heißt das nicht, dass du `multiprocessing` dafür verwenden solltest. Würdest du `ffmpeg` via `multiprocessing` starten wenn es in Python geschrieben wäre? Eher nicht.
Aber eventuell würdest du es in einen Thread packen. Parallelisieren mit `multiprocessing` existiert hauptsächlich aufgrund des Python GILs, es bietet eine einfache Möglichkeit den GIL zu umgehen, um z.B. komplexe Berechnungen effizient und parallel durchzuführen.
Wenn dein anderes Programm Sinn macht getrennt zu existieren, solltest du es imo auch anständig als neuen Prozess via subprocess starten, ansonsonten importieren und in einen Thread packen.
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Freitag 24. Juli 2015, 19:54
von jens
schlangenbaendiger hat geschrieben:ich möchte gerne von einem aktiven Python-Programm mehrere Zeichenketten (insgesamt bis 100 Zeichen) zu einem anderen aktiven Python-Programm(in meinem Fall eine Tkinter-Anwendung) übermitteln.
Was ist denn das genauer?!?
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Freitag 24. Juli 2015, 19:57
von noisefloor
Hallo,
egal ob Thread oder multiprocessing - in mindestens 98% aller Fälle führt man Python Skript B nicht aus Skript A heraus mittels `subprocess` aus, weil's irgendwo zwischen unnötig bis komplett falsch ist.
Gruß, noisefloor
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Freitag 24. Juli 2015, 19:58
von jens
Da könntest du recht haben... Dennoch kommt es darauf an, was es denn nun wirklich ist, würde ich sagen...
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Samstag 25. Juli 2015, 08:48
von schlangenbaendiger
jens hat geschrieben:... Dennoch kommt es darauf an, was es denn nun wirklich ist, würde ich sagen...
In meinem Fall:
Das erste Python-Skript ist ein SMTP-Server (smtpd), welcher von der Fritzbox per Push-Service E-Mails bekommt (wer gerade anruft) und aus dieser E-Mail dann TelefonNr, Datum und Zeit filtert. Diese Daten sollen dann an eine Tkinter-Anwendung (zweites Python-Skript) übergeben werden.
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Samstag 25. Juli 2015, 09:03
von jens
Warum dann überhaupt die Trennung?!?
Re: Kommunikation zwischen zwei Prozessen
Verfasst: Samstag 25. Juli 2015, 09:44
von snafu
@schlangenbaendiger: Module sind dir aber schon bekannt, oder?
Oder anders gefragt: Warum glaubst du, das in deinem Fall mit Prozessen lösen zu müssen?