Seite 1 von 2

Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Dienstag 28. Oktober 2014, 20:06
von Knuffi
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

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Dienstag 28. Oktober 2014, 21:31
von darktrym
Willst du IPC, dafür gibts Pipes, wenn du voneinander abhängen sprich geforkt wurden.

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Dienstag 28. Oktober 2014, 21:38
von mieszko
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

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Dienstag 28. Oktober 2014, 21:53
von BlackJack
Von `execfile()` würde ich ja dringend abraten. Wenn das eine Option wäre könnte man das andere Modul auch einfach importieren.

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Dienstag 28. Oktober 2014, 23:48
von mieszko
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 '>

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Dienstag 28. Oktober 2014, 23:54
von BlackJack
@mieszko: Na dann importiert man in dem anderen Modul halt auch das `os`-Modul wenn man es dort benötigt.

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Mittwoch 29. Oktober 2014, 08:10
von Sirius3
@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?

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Mittwoch 29. Oktober 2014, 08:43
von Knuffi
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

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Mittwoch 29. Oktober 2014, 09:21
von 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.

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Mittwoch 29. Oktober 2014, 12:00
von Knuffi
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

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Mittwoch 29. Oktober 2014, 12:41
von 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.

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Mittwoch 29. Oktober 2014, 12:44
von snafu
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.

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Mittwoch 29. Oktober 2014, 12:58
von Knuffi
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

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Mittwoch 29. Oktober 2014, 13:09
von 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.

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Mittwoch 29. Oktober 2014, 13:12
von jerch
Ws ist eigentlich ein PRG? prime random generator? :K

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Mittwoch 29. Oktober 2014, 13:13
von snafu
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.

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Mittwoch 29. Oktober 2014, 13:15
von Sirius3
@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?

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Mittwoch 29. Oktober 2014, 13:15
von Knuffi
PRG = Program
Gruß
Gabi

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Mittwoch 29. Oktober 2014, 13:16
von Knuffi
PRG = Programm
Gruß
Gabi

Re: Datenaustausch zwischen 2 laufenden Programmen

Verfasst: Mittwoch 29. Oktober 2014, 13:23
von Knuffi
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