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?
Kommunikation zwischen zwei Prozessen
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Sofern das OS es unterstützt, kannst du dich auch benachrichtigen lassen. z.B. inotify unter linux...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.
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.
-
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:
Eigentlich will ich ja nur einen ganz einfachen Beispiel-Code.. hätte nicht gedacht, dass das so kompliziert wird was passendes zu finden.
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()
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.
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
-
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.“
- 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
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
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.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.
-
schlangenbaendiger
- User
- Beiträge: 8
- Registriert: Mittwoch 22. Juli 2015, 16:24
Ich hatte mich jetzt die letzte Zeit nach diesem Vorschlag orientiert und folgendes zusammengebastelt: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.
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)
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?
-
schlangenbaendiger
- User
- Beiträge: 8
- Registriert: Mittwoch 22. Juli 2015, 16:24
Ich habe leider keine Ahnung von Multiprocessing. Hat jemand ein passenden Beispiel-Code dafür?jens hat geschrieben:Wenn du das andere programm mittels subprocess startest, könntest du dann nicht gleich auch multiprocessing nehmen?!?
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Bei https://docs.python.org/3.4/library/mul ... ssing.html gibt es einige Beispiele 
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.
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
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Was ist denn das genauer?!?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.
- 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
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
-
schlangenbaendiger
- User
- Beiträge: 8
- Registriert: Mittwoch 22. Juli 2015, 16:24
In meinem Fall:jens hat geschrieben:... Dennoch kommt es darauf an, was es denn nun wirklich ist, würde ich sagen...
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.
