Neustart eines Python-Programms

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.
Antworten
Melody
User
Beiträge: 18
Registriert: Donnerstag 29. August 2013, 15:22

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.
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.
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.
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.
Melody
User
Beiträge: 18
Registriert: Donnerstag 29. August 2013, 15:22

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?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
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.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

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
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Melody
User
Beiträge: 18
Registriert: Donnerstag 29. August 2013, 15:22

Super, vielen Dank für eure Tipps, ich habe das Problem jetzt gelöst und wieder eine Menge gelernt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-) )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten