Seite 1 von 1

"Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Samstag 24. April 2021, 18:26
von PeB
Mein Problem sollte eigentlich trivial sein, irgendwie beiße ich mir aber trotzdem die Zähne daran aus:

Ich möchte eine py (Slave.py) von einer anderen py (Master.py) starten/ausführen lassen. Und zwar mehrfach, wobei die Slave.py immer vollständig neu gestartet wird, d.h. auch alle dortigen Variablen und dortigen Importe bei jedem Start etc. neu initialisiert werden. Als Schmankerl möchte ich bei jedem Neustart der Slave.py durch die Master.py jeweils andere Variablen-Werte übergeben können.

Ich arbeite in WIN10 mit der Python IDLE und habe Python 3.8.3.

Gibt es eine Lösung, und am Besten auch noch eine einfache?

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Samstag 24. April 2021, 18:47
von Sirius3
Die Lösung ist trivial: schreibe ein richtiges Modul, das keine Nebeneffekte hat und du eine Funktion hast, die du mit den gewünschten Parametern beliebig oft aufrufen kannst.

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Samstag 24. April 2021, 19:27
von __deets__
Üblicherweise macht man das nicht. Sondern erstellt zb einfach eine Klasse, und die hat allen Zustand. Und kann das Objekt dann abräumen & ein neues erzeugen.

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Samstag 24. April 2021, 21:27
von PeB
Hat nicht jemand eine wirkliche Antwort in petto?

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Samstag 24. April 2021, 21:37
von TenchiMuyo1984
Du hast doch alle relevanten Antworten bekommen.
Oder brauchst du ein Bsp. in Form einer Implementierung?

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Samstag 24. April 2021, 21:40
von __deets__
Das subprocess Modul enthält alle notwendigen Utensilien, um dein Problem zu lösen. Es gibt auch schön viele Beispiele. Viel Erfolg.

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Sonntag 25. April 2021, 10:27
von PeB
Ich denke, ich sollte die Frage vielleicht noch mal nachvollziehbarer beschreiben:

Bei der "Slave" genannten py handelt es sich um ein ziemlich umfangreiches Programm (> 1000 Zeilen), dass soweit für sich steht und läuft. Im Kern bereitet es einen Datenstrom auf und schickt das dann durch ein neuronales Netz mit entsprechenden Auswertungen. Für einen Durchlauf braucht es zwischen 1 bis 12 Stunden. Danach muss die Slave.py beendet und mit geänderten Eingangs-Parametern neu gestartet werden, schon weil die KI (KERAS etc.) den Parameterwechsel ansonsten nicht zuverlässig verträgt. Und so on. Das möchte ich nun von der Master-py steuern lassen, aber irgendwie funkt das überhaupt nicht.

Wenn ich mit import und reload arbeite, wird die Slave.py nicht wirklich komplett zurückgesetzt und neu gestartet.

Meine Versuche mit subprozess haben mich auch nicht zum Ziel gebracht:

Wenn ich in der Master.py schreibe:

import subprocess
import sys
proc = subprocess.Popen(["python", "Slave.py"],stdout=subprocess.PIPE, shell=True)
stddata = proc.communicate()
print("stddata: ",stddata)

habe ich gleich mehrere Probleme:
1. Die Slave.py wird nicht vollständig ausgeführt.
2. Die Slave.py läuft nicht in der Python.IDLE
3. Ich bekomme Parameter nicht von der Master.py an die Slave.py übergeben, auch wenn ich in der Slave.py z.B. schreibe
import Master
a = Master.a
4. Auch ist die Rückgabe und Anzeige der print-Ausgaben der Slave.py in der IDLE ist nicht vollständig.

Das ganze subprocess-Thema ist mir fremd und erschließt sich mir für mein spezielles Problem auch aus den Beispielen nicht. Also für eine konkrete Hilfe, wie ich dass schreiben kann, wäre ich dankbar.

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Sonntag 25. April 2021, 10:59
von __blackjack__
@PeB: Ich denke die allererste Antwort von Sirius3 trifft es immer noch. Die gilt im Grund auch ziemlich generell. Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Der Import eines Moduls sollte darüber hinaus keine weiteren Effekte haben. Dann hast Du in dem Modul eine Funktion, welche die Aufgabe erledigt, und die benötigte Parameter als Argumente beim Aufruf übergeben bekommt.

Vergiss im Zusammenhang von laufenden Programmen mal IDLE und dort import und reload. Das ist eine IDE, und keine Umgebung für Programme deren Vorhandensein ein Programm voraussetzen sollte. Konsolenprogramme müssen letztlich ohne IDE in einer Konsole laufen.

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Sonntag 25. April 2021, 11:43
von Rotmilan
ich wurschtel ja auch immer noch mit python rum und habe keine wirklich große ahnung,.

wie man beim starten eines programmes werte übergibt weiß ich erst recht nicht. ich würde das jetzt vom ansatz so lösen, dass ich den master die zu übergebenden werte in eine datei (text/xml...) schreiben lassen. die könnte dann die slave wieder auslesen.

soweit mal meine idee für das übergeben der werte, falls dir das schwierigkeiten macht - für alles andere bin ich noch unqualiizierter und halte mich raus ;-)

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Sonntag 25. April 2021, 12:32
von PeB
Rotmilan hat geschrieben: Sonntag 25. April 2021, 11:43 ich wurschtel ja auch immer noch mit python rum und habe keine wirklich große ahnung,.

wie man beim starten eines programmes werte übergibt weiß ich erst recht nicht. ich würde das jetzt vom ansatz so lösen, dass ich den master die zu übergebenden werte in eine datei (text/xml...) schreiben lassen. die könnte dann die slave wieder auslesen.

soweit mal meine idee für das übergeben der werte, falls dir das schwierigkeiten macht - für alles andere bin ich noch unqualiizierter und halte mich raus ;-)
Hey! Das ist zumindest mal eine Idee! Danke!

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Sonntag 25. April 2021, 13:06
von PeB
habe etwas gefunden, das zumindest die Slave.py in der IDLE executiert:

exec(open('Slave_01.py').read())

https://stackoverflow.com/questions/172 ... tive-shell

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Sonntag 25. April 2021, 13:10
von __deets__
Bild

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Sonntag 25. April 2021, 18:12
von noisefloor
Hallo,
habe etwas gefunden, das zumindest die Slave.py in der IDLE executiert:
Dann vergiß' einfach wieder, dass du diese Codezeile je gesehen hast. Das ist ja ein ganz schlimmer Würg-Around, macht man so nicht.

Grundsätzlich: wenn du aus Pyhton-Programm A Python-Programm B mittels `subprocess` oder so ausführst, dann machst du in 99,9% der Fälle einen Fehler.

Wie es richtig geht, wurde dir mehrfach gesagt. Wenn du das nicht verstehst solltest du unbedingt nachfragen anstatt irgendwelchen schlimmen Hacks zu probieren...

Wie gut kannst du denn Python? Hast du verstanden, wie Funktionen und Rückgabewerte funktionieren? Weißt du, wie man einen eigene Klasse schreibt und instanziert? Weißt da, was das `import` Statement macht?

Gruß, noisefloor

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Sonntag 25. April 2021, 20:44
von ThomasL
PeB hat geschrieben: Sonntag 25. April 2021, 10:27 Bei der "Slave" genannten py handelt es sich um ein ziemlich umfangreiches Programm (> 1000 Zeilen), dass soweit für sich steht und läuft. Im Kern bereitet es einen Datenstrom auf und schickt das dann durch ein neuronales Netz mit entsprechenden Auswertungen. Für einen Durchlauf braucht es zwischen 1 bis 12 Stunden. Danach muss die Slave.py beendet und mit geänderten Eingangs-Parametern neu gestartet werden, schon weil die KI (KERAS etc.) den Parameterwechsel ansonsten nicht zuverlässig verträgt.
Wenn man das ordentlich programmiert, dann verträgt Tensorflow/Keras jeglichen Parameterwechsel.
Wenn dem nicht so ist, sollte dieses "umfangreiches Programm" überarbeitet werden
und mit master.py zusammengelegt werden.
Alles andere ist Frickelei allerübelster Art.

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Montag 26. April 2021, 12:20
von PeB
Also da fällt mir ein Witz ein:
Geht ein Mann, weil er nicht schlafen kann, nachts spazieren. Da sieht er einen anderen Mann unter einer Laterne, der dort offensichtlich etwas sucht. Er fragt ihn daher: "Haben Sie etwas verloren?" "Ja, meinen Schlüssel", antwortet der andere Mann. "Hier?" hakt der Mann nach. "Nein, dort hinten irgendwo", erwidert der andere Mann. "Aber warum suchen Sie denn dann hier?", fragt der Mann nun verwundert. "Weil hier Licht ist."

Also wenn man das so formuliert, läuft es - gegen alle Unkenrufe hier - stabil durch:

SlaveDatei = "Slave.py"
with open(SlaveDatei) as f:
code = compile(f.read(), SlaveDatei, 'exec')
exec(code)

Mit dem Statement kann man die Slave.py wiederholt und "fresh" durchlaufen lassen. Die Print-Ausgaben erfolgen in der IDLE auch so, als würde die Slave.py standalone laufen. Und schön ist auch, dass die Master.py erst weitermacht, wenn ein Durchlauf der Slave.py beendet ist. Was bisher einzig noch nicht funkt, ist, innerhalb des Statements Variablenwerte von der Master.py an die Slave.py zu übergeben.

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Montag 26. April 2021, 12:30
von Sirius3
Fällt ein Mann aus dem Fenster im 38. Stockwerk. Als er am 10. vorbeifällt denkt er sich: ›Glück gehabt, nichts schlimmes passiert‹.
Du näherst dich dem Boden, wenn Du merkst, dass Du keine Variablenwerte übergeben kannst und auch Deine Module nicht neu geladen werden.

Re: "Slave.py" von "Master.py" mehrfach neu starten und neu initialisieren lassen

Verfasst: Montag 26. April 2021, 12:39
von __deets__
Wenn du deinen 1000-Zeilen-Mystery-Code in eine vernuenftige Form bringen wuerdest, dann koennte das auch "fresh" durchlaufen. Und als Bonus obendrauf auch noch Argumente uebergeben!

Aber schiess dir ruhig weiterhin von hinten durch die Brust ins Auge. Es gibt Leute, denen reicht der Hinweis, dass eine Herdplatte heiss ist. Andere lernen erst nach dem dritten Hauttransplantat. Manche nie.