8 Stimmen

Neustart eines Python-Programms

Ich schreibe ein Python-Programm, das, wenn der Benutzer die Einstellungen während des Betriebs ändert, neu gestartet werden muss, um die geänderten Einstellungen anzuwenden. Gibt es eine Möglichkeit, dies zu tun? Ich denke an etwas in dieser Art:

import sys
command_line = ' '.join(sys.argv)
# Jetzt etwas mit command_line machen
# Jetzt rufe mein benutzerdefiniertes Beendigungsverfahren auf

Hinweis: Ich bin auf Windows, falls das einen Unterschied macht

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

8voto

paxdiablo Punkte 809679

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:

  1. 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.

  2. 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.

  3. 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.

6voto

ars Punkte 112843

Unter Unix können Sie die os.execl-Familie von Funktionen verwenden:

Diese Funktionen führen alle ein neues Programm aus, das den aktuellen Prozess ersetzt; sie geben nicht zurück. Unter Unix wird das neue ausführbare Programm in den aktuellen Prozess geladen und hat dieselbe Prozess-ID wie der Aufrufer. Fehler werden als OSError-Ausnahmen gemeldet.

Unter Windows werfen Sie einen Blick auf die os.spawnl-Familie, die weniger effizient als die Unix-Aufrufe sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X