Datenaustausch zwischen 2 laufenden Programmen

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.
Knuffi
User
Beiträge: 62
Registriert: Dienstag 28. Oktober 2014, 19:52

Guten Abend,
ich bin neu hier und habe da auch gleich eine Frage und bitte um eure Hilfe:
ich möchte zwischen 2 laufenden Python Programmen Variable austauschen. Ich habe auch dieses Forum lange durchsucht, aber ich bin zu sehr Anfänger, um alles zu verstehen. Ich habe mich in "Umgebungsvariablen" versucht. Leider ohne Erfolg. Das was ich gefunden habe war "zu Hoch" für mich. Ich bräucht eine Hilfe Schritt für Schritt. Bitte helft mir.
meine letzten Versuche

Prg1.py (Variable definieren, Endlos Schleife)
......
......

Code: Alles auswählen

import os
y = 12345678
print(y)
while 1:
 a = a

Prg2.py (Variable aus PRG 1 auslesen)
.....

Code: Alles auswählen

import os
y1 = os.environ[prg1.py]
print(y1)
Funtioniert nicht.
Wäre es pickle besser? Kann ich aber auch nicht!!!
Gruß
Gabi
Zuletzt geändert von Anonymous am Dienstag 28. Oktober 2014, 20:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Willst du IPC, dafür gibts Pipes, wenn du voneinander abhängen sprich geforkt wurden.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
mieszko
User
Beiträge: 5
Registriert: Samstag 18. Oktober 2014, 21:48

Du muss ausführen deine skript/You have to execute your script:
Prg2.py:

Code: Alles auswählen

>>> execfile('/full/path/to/Prg1.py')
>>> y
12345678
und dann diese variablen sind in deine Namensraum/ namespace
BlackJack

Von `execfile()` würde ich ja dringend abraten. Wenn das eine Option wäre könnte man das andere Modul auch einfach importieren.
mieszko
User
Beiträge: 5
Registriert: Samstag 18. Oktober 2014, 21:48

BlackJack hat geschrieben:Von `execfile()` würde ich ja dringend abraten. Wenn das eine Option wäre könnte man das andere Modul auch einfach importieren.
Na ja, aber in usere Beispiel das Skript Prg1.py beginnt mit:

Code: Alles auswählen

import os
Also mit import in Prg2.py :

Code: Alles auswählen

>>> import Prg1
>>> os
Traceback (most recent call last):
 ....bla bla...
NameError: name 'os' is not defined
aber mit execfile()

Code: Alles auswählen

>>> execfile( '/path/to/file/Prg1')
>>> os
<module 'os' from '/usr/lib/python2.7/os.pyc '>
BlackJack

@mieszko: Na dann importiert man in dem anderen Modul halt auch das `os`-Modul wenn man es dort benötigt.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Knuffi: über Environment-Variablen kann man keine Daten zwischen Prozessen austauschen, weil das Environment für jeden Prozess kopiert wird. Es gibt viele verschiedene Methoden zur Interprocesskommunication. Je nach Anwendungsfall ist die eine Methode besser oder die andere. Was willst Du machen?
Knuffi
User
Beiträge: 62
Registriert: Dienstag 28. Oktober 2014, 19:52

Hallo
herzlichen Dank für eure Hilfe. Mein Ziel ist es zwischen 2 Unterschiedlichen PRG Varaiablen auszutauschen.
Extreme Kurzfassung
Mein erstes PRG kümmert sich um 8 LCD Display 20x4, misst die Temperatur und steuert Schrittmotoren
Das 2. Prg kümmert zwischenzeitlich sich um Tastenabfragen.
PRG 1 kann währen des laufens keine Taste abfragen, das es selber sehr beschäftigt ist und den Impuls des Tasters nicht erkennen würde. Nach barbeiten soll die Variable aus PRG ausgelesen werden und evtl agiert werden und Variable in PRG 2 löschen
PRG 2 fragt nur den Taster ab, wenn Taster gedrückt wird Variable verändert.
Das Prg1 um das es geht hat mittlerweile über 2000 Zeilen ich muss daher diese Abfraeg über ein eigenes PRG gestallten
Gruß
Gabi
BlackJack

@Knuffi: Ich würde das ja im gleichen Programm machen und nicht weil das eine zu gross geworden ist, das nächste Anfangen und die kommunizieren lassen. Das ist aufwändiger als innerhalb eines Programms mit Threads zu arbeiten und die über `Queue`-Objekte miteinander Daten austauschen zu lassen.

2000 Zeilen klingt nach ziemlich viel. Da das mehrere Sachen macht, lässt sich das sicher in ein Package stecken und sinnvoll auf Module aufteilen. Und falls das ein typischers Anfängerprogramm ist, kann man da sicher auch einiges kürzer umschreiben.
Knuffi
User
Beiträge: 62
Registriert: Dienstag 28. Oktober 2014, 19:52

Hallo
ja es ist richtig dass ich Anfänger bin. Dies bezieht sich auf meinen Raspberry PI und auf Python. Ich programmiere seit meiner C64ér Zeit, Basic, Pascal, Visual Basic. Ich gehe daher davon aus, das das bestehende PRG schon optimal programmiert ist. I
Am Anfang der der Programmierung standen nur Ausgabe- und Steuerungsroutinen. Jetzt möchte ich gernen noch Tastenabfragen.
Dazu möchte ich 2 PRG gleichzeitig laufen lassen.
Was sind den eigenlich Pipes?
Gruß
Gabi
BlackJack

@Knuffi: Wenn Du in Python Anfänger bist dann ist es sehr unwahrscheinlich dass das Programm optimal ist, denn Vorkenntnisse in anderen Sprachen vermitteln einem ja nicht idiomatisches Python. Zumal keine der genannten Sprachen eine dynamisch typisierte objektorientierte Programmiersprache auf dem Abstraktionsniveau von Python ist. Eine Sprache in der *alles* ein Objekt ist was man an einen Namen binden kann.

Pipes sind Dateien die Programme verbinden, also Objekte welche die gleiche API wie `file`-Objekte haben, aber nicht zwingend als benannte Datei im Dateisystem bestehen müssen: https://en.wikipedia.org/wiki/Pipeline_%28Unix%29

Ich denke es ist klar geworden was Du möchtest — es erscheint nur nicht besonders sinnvoll das so zu lösen.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Langjährige Progammiererfahrung in anderen Sprachen (von welcher Qualität auch immer) heißt sicherlich nicht, dass man als Python-Anfänger optimale Python-Programme schreibt. Das ist IMHO sogar ziemlich unwahrscheinlich. Zumal man streng genommen definieren sollte, was denn bitte ein "optimales Python-Programm" sein soll. Das nur als Randbemerkung...

EDIT: BlackJack war schneller.
Knuffi
User
Beiträge: 62
Registriert: Dienstag 28. Oktober 2014, 19:52

Hallo
super danke für Eure Info´s. Ja das PRG ist etwas ungeschickt programmiert, gebe es ja zu ; Anfängerfehler. Zu Beginn hatte ich versucht mittels fork() die 8 Displays parallel laufen zu lassen. Auch damals konnte ich das Problem zwischen den einzelnene kinds Daten auszutauschen nicht lösen. Daher lasse ich das PRG seriell laufen, ein Display nach dem andererm. Nun habe ich wieder den Salat, dass ich Daten zwischen 2 PRg nicht austauschen kann. Als letzte (ja ich weiß, es gibt sicherlich bessere Lösungen) werde ich die Variable in einer Textdatei ablegen und von dem anderen Prg auslesen, bearbeiten und löschen. Es gehört meiner Meinung gerade für einen Anfänger wie mich dazu sich nicht von jeder Widrigkeit aufhalten zu lassen. Dss macht es gerade Spannend, etwas neues zu erlernen. Ich finde es immer wieder lustig, wenn man später reflektiert, welche Anstrengungen man unternommen hat ein Problem zu lösen und man später weiß wie einfach es doch eigentlich ist
Gruß
Gabi
BlackJack

@Knuffi: Die einfachste Lösung wäre es Threads statt Prozessen zu verwenden. Damit hat man mehrere Sachen die ”gleichzeitig” laufen und muss nicht Daten zwischen Prozessen austauschen. Und sich schon gar nicht irgendeine krude Interprozesskommunikation mittels Textdateien selber basteln.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Ws ist eigentlich ein PRG? prime random generator? :K
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Es stimmt schon: Eine unelegante Lösung, die funktioniert, ist notfalls immer noch besser als überhaupt keine Lösung und ein schlimmstenfalls daran gescheitertes Projekt. Allerdings hilft das Forum ja gerade bei solchen Problemen. Wenn es nicht zu speziell ist, kriegt man hier durchaus gute Antworten. Zumal es oft nicht nur um Eleganz geht, sondern auch im die Vermeidung von Fehlern im laufenden Betrieb, an die man zunächst gar nicht gedacht hatte.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Knuffi: nochmal, das in zwei Programme aufspalten zu wollen, ist eine schlechte Idee. Es gibt keinen Vorteil gegenüber einem Programm, aber viele Nachteile, wie z.B. deutlich komplexere Programme, wegen der zusätzlichen Kommunikationsschnittstelle, deutlich schwierigeres Testen und Fehlersuchen.
Also, warum müssen es unbedingt zwei Programme sein?
Knuffi
User
Beiträge: 62
Registriert: Dienstag 28. Oktober 2014, 19:52

PRG = Program
Gruß
Gabi
Knuffi
User
Beiträge: 62
Registriert: Dienstag 28. Oktober 2014, 19:52

PRG = Programm
Gruß
Gabi
Knuffi
User
Beiträge: 62
Registriert: Dienstag 28. Oktober 2014, 19:52

Hallo Sirius
die Hauptanwendung des PRG (Programm) ist es über LCD Module 4X20 Informationen ausgebe z.B im Wohnzimmer. An diesen Modulen sind kleine Tasten mit denen ein Menü gesteuert werden kann (bei Bedarf). Im Extremfall könnte man Stunden in diesem Menü bleiben. Wenn in dieser Zeit ein Kontakt an einer ganz anderen Stelle (z.B im Garten) an einer anderen Hardwarekomponente ausgelöst wird, wird dieser von dem eigentlichen PRG nicht erkannt. Daher möchte ich ein 2. PRG laufen lassen, das nicht anderes macht als zu überwachen ob einKontakt geschlossen wurde.
Gruß
Gabi
Antworten