Seite 1 von 1
Neustart eines Python-Programms
Verfasst: Freitag 13. September 2013, 09:32
von Melody
Hallo an alle,
ich habe ein Programm geschrieben, dass aus 2 Python-Dateien besteht.
Mit der einen Python-Datei (Programm1.py) rufe ich die zweite Python-Datei, das Hauptprogramm (Programm2.py) auf. Nach dem Durchlaufen des Hauptprogramms soll es von Programm1 aus immer wieder neu gestartet werden. Dies funktioniert auch. Jedoch soll das Hauptprogramm geschlossen werden und erneut gestartet werden, wenn bestimmte Bedingungen nicht erfüllt sind.
Dies funktioniert leider nicht, mit dem Befehl sys.exit(), den ich im Programm2 geschrieben habe, wird auch Programm1 geschlossen.
Der Code für das Programm1 sieht folgendermaßen aus:
Code: Alles auswählen
import Programm2
while True:
print 3*"\n"
reload(Programm2)
Und hier ein Beispiel-Code aus dem Programm2, der das Programm schließen soll, wenn bestimmte Bedingungen nicht efüllt sind:
Code: Alles auswählen
import time
import sys
if len(ListeMax2)+1<Anzahl:
print 3*"\n", "##Fehler##", 2*"\n", "Fehler, Anzahl der Maxima zu gering!", "\n"
time.sleep(5) #Timer mit 20s
sys.exit()
Vielen Dank schon mal für eure Hilfe! Vielleicht gibt es ja eine elegante Möglichkeit, das Problem zu lösen.
Re: Neustart eines Python-Programms
Verfasst: Freitag 13. September 2013, 10:19
von BlackJack
@Melody: Das sieht alles sehr komisch aus. `reload()` ist IMHO nicht dazu gedacht in Programmen verwendet zu werden. Selbst in einer Python-Shell hat es genug Probleme, derer man sich bewusst sein sollte wenn man es verwendet.
Wenn beide Module *ein* Programm sein sollen, dann würde man das so schreiben, dass der Code nicht beim Importieren automatisch abläuft, sondern dass man Funktionen definiert, die man aufruft. Wenn es zwei Programme sein sollen, dann würde man das zweite Programm aufrufen wie jedes andere externe Programm, mit dem `subprocess`-Modul.
Die Formulierung mit `sys.exit()` würde auch Programm 1 geschlossen ist falsch, weil es bei Dir nur *ein* Programm gibt, das aus zwei Modulen besteht. Der Code läuft im selben Prozess und der wird durch den `sys.exit()`-Aufruf beendet.
Re: Neustart eines Python-Programms
Verfasst: Freitag 13. September 2013, 10:35
von CasualCoding.org
Ich bin zwar selbst Anfänger, aber meines Erachtens geht das nur, wenn beide Dateien unabhängig voneinander laufen. Klartext: Du müsstest mit Threads arbeiten.
Re: Neustart eines Python-Programms
Verfasst: Freitag 13. September 2013, 11:21
von BlackJack
@SolitaryMan: Threads sind nicht in dem Sinne unabhängig. Die laufen im gleichen Prozess und wenn dort irgendwo `sys.exit()` ausgeführt wird, dann beendet das den Prozess und damit alle Threads.
Ich sehe auch nicht was da nebenläufig ausgeführt werden soll, denn Programm1 geht offensichtlich davon aus, dass die Ausführung von Programm2 nicht asynchron passiert. Sonst hätte man bei der Schleife ein Problem, weil sie so schnell wie der Rechner das irgendwie hergibt neue Threads starten würde, was zum Absturz des Programms führen dürfte.
Re: Neustart eines Python-Programms
Verfasst: Freitag 13. September 2013, 13:32
von Melody
Vielen Dank für die Antworten.
Gibt es bei dem Befehl subprocess auch die Möglichkeit, auf einzelne Variablen des zweiten Programms im ersten Programm zuzugreifen?
Re: Neustart eines Python-Programms
Verfasst: Freitag 13. September 2013, 13:42
von /me
Melody hat geschrieben:Gibt es bei dem Befehl subprocess auch die Möglichkeit, auf einzelne Variablen des zweiten Programms im ersten Programm zuzugreifen?
Nein, nicht direkt. Du könntest beim Start Werte übergeben. Wenn du im Programmverlauf Daten austauschen willst, dann musst du auf irgendeine Art und Weise der Interprozesskommunikation zurückgreifen. Du könntest beispielsweise JSON-Daten via Netzwerk hin und her schicken.
Re: Neustart eines Python-Programms
Verfasst: Freitag 13. September 2013, 14:26
von BlackJack
@Melody: Ergänzend zu /me: Wenn das erste Programm Werte aus dem zweite Programm verwenden will, dann könnte das zweite Programm diese zum Beispiel als JSON serialisiert ausgeben und das erste Programm liest die dann ein.
Als erstes solltest Du aber wirklich klären ob Du wirklich zwei Programme brauchst, oder ob es nicht reicht das zweite „Programm” so zu schreiben, dass man die Funktionalität auch von einem anderen Modul aus verwenden kann, also in dem man das so schreibt, dass man es als Modul importieren kann ohne dass es gleich als Programm abläuft und das die Funktionalität als Funktionen und eventuell Klassen zur Verfügung stellt.
Re: Neustart eines Python-Programms
Verfasst: Freitag 13. September 2013, 19:37
von bwbg
Wenn Du dich an das main-Idiom hälst, kannst du das recht einfach realisieren:
program1.py
Code: Alles auswählen
#!/usr/bin/env python3
import program2
def main():
print("Do something useful")
program2.main()
if __name__ == '__main__':
main()
program2.py
Code: Alles auswählen
#!/usr/bin/env python3
def main():
print("Do something even more useful")
if __name__ == '__main__':
main()
Voraussetzung ist natürlich, dass es sich um python-Module handelt.
Parameter und Rückgabewerte können so nach Belieben verwendet werden.
Grüße ... bwbg
Re: Neustart eines Python-Programms
Verfasst: Sonntag 15. September 2013, 01:34
von Melody
Super, vielen Dank für eure Tipps, ich habe das Problem jetzt gelöst und wieder eine Menge gelernt.
Re: Neustart eines Python-Programms
Verfasst: Sonntag 15. September 2013, 07:52
von Hyperion
Melody hat geschrieben:Super, vielen Dank für eure Tipps, ich habe das Problem jetzt gelöst und wieder eine Menge gelernt.
Es wäre prima, wenn Du kurz beschreiben könntest, *wie* Du es nun gelöst hast. Sei es als Verweis auf ein Posting mit einem Vorschlag, den Du umgesetzt hast, sei es mit der Beschreibung der Lösung, wenn Du es ganz anders gemacht hast. Oftmals sucht man eine Lösung für ein Problem durch das Suchen im Forum - und da hilft ein "Prima, hab das Problem gelöst" nicht weiter
(Auch wenn dieser Thread kaum dazu gehören wird, ist es gut, sich das prinzipiell anzugewöhnen

)