Ich würde alle Ängste umgehen, die du wahrscheinlich bekommst, wenn du versuchst, dich selbst neu zu starten, und es stattdessen in die Hände der Umgebung legen.
Damit meine ich:
-
Haben Sie ein Steuerungsprogramm, das nichts weiter tut, als Ihr Programm (mit denselben Parametern, die ihm gegeben wurden) in einer Schleife auszuführen, während Ihr Programm mit einem spezifischen "Neustart"-Code beendet wird. Dies könnte so einfach wie eine cmd
-Datei sein oder so komplex wie ein anderes (sehr einfaches) Python-Programm, das os.system
verwendet. Im Grunde genommen wird das Steuerungsprogramm Ihr Programm mit genau denselben Parametern erneut ausführen, solange es den Code "Neustart" erhält. Jeder andere Code führt dazu, dass das Programm mit diesem Code beendet wird.
-
Wenn Sie vollständig beenden möchten, lassen Sie Ihr echtes Python-Programm mit dem Rückgabecode 0 (oder einem anderen Code, der sich nicht im "Neustart"-Code befindet, in einer Fehler situation) beenden.
-
Wenn Sie einfach zu einer anderen Iteration Ihres Programms wechseln möchten (zum Beispiel um die Konfiguration erneut zu lesen), beenden Sie mit dem "Neustart"-Code, den das Steuerungsprogramm erkennt.
Aber Sie könnten auch darüber nachdenken, Ihre Anwendung so umzustrukturieren, dass sie ihre Konfiguration jederzeit erneut lesen kann. Dadurch lässt sich das gesamte Problem lösen. Sie erwähnen nicht, warum dies keine Option ist, also gehe ich davon aus, dass es einen Grund gibt, warum es nicht funktioniert.
Aber wenn nicht, ist das der Weg, den ich wählen würde.
Um einen Beispielcode für die erste Option bereitzustellen (dies ist unter Windows, aber unter Cygwin - die grundlegenden Regeln sollten auch für das native Windows-Python gelten, aber Sie sollten die Rückgabewerte von os.system
überprüfen):
> cat phase1.py
#!/usr/bin/python
import os
status = 9
while status == 9:
status = int(os.system ("./phase2.py") / 256) # Exit-Code ist obere 8 Bit
print "Controller: %d"%(status)
> cat phase2.py
#!/usr/bin/python
import sys
import time
time.sleep(1)
val = int(time.time())%10
if val == 0:
rc = 0
else:
rc = 9
print "Programm: %d -> %d"%(val,rc)
sys.exit(rc)
> ./phase1.py
Programm: 2 -> 9
Controller: 9
Programm: 3 -> 9
Controller: 9
Programm: 4 -> 9
Controller: 9
Programm: 5 -> 9
Controller: 9
Programm: 7 -> 9
Controller: 9
Programm: 8 -> 9
Controller: 9
Programm: 9 -> 9
Controller: 9
Programm: 0 -> 0
Controller: 0
Sie sehen, dass der Steuerer das Verlassen mit einem Code von 9 verwendet, um zu entscheiden, ob das Programm erneut gestartet werden soll. Das Programm selbst ist ein dummes Programm, das immer eine 9 zurückgibt, es sei denn, es handelt sich um ein Vielfaches von 10 Sekunden.
0 Stimmen
Auf UNIX verwenden Hintergrundprozesse in der Regel Signalhandler. Schauen Sie sich das Signalmodul in Python an. Sie könnten wahrscheinlich dasselbe in Windows tun.
0 Stimmen
Verwandt: Ist es möglich, die python -O (optimize) Flagge innerhalb eines Skripts zu setzen?