ubuntuusers.de

Interprozesskomunikation mit Python

Status: Gelöst | Ubuntu-Version: Ubuntu MATE 16.04 (Xenial Xerus)
Antworten |

JakobDev

Avatar von JakobDev

Anmeldungsdatum:
11. Dezember 2015

Beiträge: 290

Wohnort: Saarland

Ich suche nach einer Möglichkeit, mich mit Python zu einem bereits laufenden Prozess zu verbinden. Der Grund dafür ist, das ich in mein Programm gerne die Möglichkeit, einbauen würde, Dateien in einem neuen Tab zu öffnen statt das Programm komplett neu zu starten.

Wenn der Nutzer also mein Programm mit folgendem Befehl startet:

meinProgramm /Pfad/zur/Datei.txt

soll am Anfang des Programms in Pseudocode ausgedrückt folgendes passieren:

1
2
3
if prozessExistiert("programmname"):
    anProzessSendenSenden("open",sys.argv[1])
    sys.exit(0)

Also das gleiche was z.B. Gedit und Firefox machen.

Wie lässt sich das am besten umsetzen? Das ganze soll nur mit einem Pip Packet auskommen. Der Nutzer soll also nur pip install -r requirements.txt ausführen und sonst nichts extern installieren müssen. Das ganze soll auch Platformunabhängig sein. Also zumindest Linux, Windows und Mac. Für die grafische Oberfläche nutze ich PyQt5. Eventuell ist ja schon da was enthalten. Ich bin bisher allerdings noch nicht fündig geworden.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

du kannst dich mit einem laufenden Prozess nur Verbinden, wenn der Prozess bereits irgendwo lauscht. Ob der Prozees eine Socket aufmacht oder das über eine temporäre Datei oder ... erfolgt hängt von dir ab.

Da gedit oder Firefox aber OSS sind, kannst du in deren Quellcode auch nach schauen, wie das da umgesetzt wird.

Gruß, noisefloor

dirkolus

Anmeldungsdatum:
17. Mai 2011

Beiträge: 2177

Wohnort: dahoam

noisefloor schrieb:

Da gedit oder Firefox aber OSS sind, kannst du in deren Quellcode auch nach schauen, wie das da umgesetzt wird.

Firefox (und potentiell auch gedit) nutzen m.W. dafür D-Bus

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Da du Qt verwendest: https://doc.qt.io/qt-5/examples-dbus.html

JakobDev

(Themenstarter)
Avatar von JakobDev

Anmeldungsdatum:
11. Dezember 2015

Beiträge: 290

Wohnort: Saarland

Ich hab mir mal ein paar D-Bus Bibliotheken von hier sowie die von PyQt5 angescahut. Leider funktioniert keine davon Out of the Box (also nur mit pip Packet) und Plattformunabhängig.Somit für mich also eher weniger brauchbar.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

Wie wäre es mit socket bzw. socketserver? Das funktioniert OOTB auf praktisch allen Plattformen, da musst du dir dann nur ein sinnvolles Protokoll überlegen, um deinem Programm zu vermitteln, was es tun soll.

JakobDev

(Themenstarter)
Avatar von JakobDev

Anmeldungsdatum:
11. Dezember 2015

Beiträge: 290

Wohnort: Saarland

Du meinst also, das laufende Programm soll einen Server auf localhost einrichten? Gibt es da nicht unter Windows Probleme mit der Firewall einiger Virenschutzprogramme?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11260

Wohnort: München

JakobDev schrieb:

Gibt es da nicht unter Windows Probleme mit der Firewall einiger Virenschutzprogramme?

Wenn man sowas nutzt, muss man auch bereit sein im Problemfall Ausnahmen für gewollte Verbindungen anzulegen.

Mit einem ausreichend modernen Windows kann man auch Unix-Style Sockets unter Windows nutzen: https://devblogs.microsoft.com/commandline/af_unix-comes-to-windows/ - aber das hat einige Einschränkungen und Python ist noch nicht soweit: https://bugs.python.org/issue33408 - ansonsten gäbe es u.a. (vgl. https://docs.microsoft.com/de-de/windows/win32/ipc/interprocess-communications) noch Named Pipes: https://docs.microsoft.com/de-de/windows/win32/ipc/named-pipes, für die man aber sowas wie mhammond/pywin32 bräuchte, wenn man nicht mit nackten ctypes-Wrappern hantieren will.

noisefloor Team-Icon

Anmeldungsdatum:
6. Juni 2006

Beiträge: 29567

Hallo,

der kleinste gemeinsame Nenner ist eine temporäre Datei. Dafür gibt es ootb ein Modul in der Python Standardinstallation, was AFAIK auf Cross-Plattform funktioniert.

Gruß, noisefloor

JakobDev

(Themenstarter)
Avatar von JakobDev

Anmeldungsdatum:
11. Dezember 2015

Beiträge: 290

Wohnort: Saarland

Die temporäre Datei in Verbindung mit QFileSystemWatcher war die Lösung! Danke!

Antworten |