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

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

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.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@schlangenbaendiger: Pipes sind der richtige Weg für Interprozess-Kommunikation. Obwohl auch oft Sockets (AF_UNIX ist für lokale Kommunikation) eingesetzt werden.
schlangenbaendiger
User
Beiträge: 8
Registriert: Mittwoch 22. Juli 2015, 16:24

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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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.
the more they change the more they stay the same
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Wieso ist D-Bus nur Linux?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
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.“
Benutzeravatar
noisefloor
User
Beiträge: 4253
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

noisefloor hat geschrieben:es gibt ein Python-Modul namens PyPubSub (https://pypi.python.org/pypi/PyPubSub/3.3.0), welche das bietet, was du suchst.
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.
a fool with a tool is still a fool, www.magben.de, YouTube
schlangenbaendiger
User
Beiträge: 8
Registriert: Mittwoch 22. Juli 2015, 16:24

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

Wenn du das andere programm mittels subprocess startest, könntest du dann nicht gleich auch multiprocessing nehmen?!?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
schlangenbaendiger
User
Beiträge: 8
Registriert: Mittwoch 22. Juli 2015, 16:24

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


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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

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?!?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
noisefloor
User
Beiträge: 4253
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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

Da könntest du recht haben... Dennoch kommt es darauf an, was es denn nun wirklich ist, würde ich sagen...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
schlangenbaendiger
User
Beiträge: 8
Registriert: Mittwoch 22. Juli 2015, 16:24

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

Warum dann überhaupt die Trennung?!?

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

@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?
Antworten