2016-10-16 17 views
0

Ich habe einen Watchdog-Timer für mein Skript (Python 3) erstellt, mit dem ich die Ausführung stoppen kann, wenn etwas schief geht (im folgenden Code nicht gezeigt). Allerdings hätte ich gerne die Möglichkeit, das Skript automatisch nur mit Python (keine externen Skripte) neu zu starten. Der Code muss plattformübergreifend kompatibel sein.Erneutes Neustarten eines Python-Skripts

Ich habe Subprozess und execv (os.execv(sys.executable, ['python'] + sys.argv)) versucht, aber ich sehe sehr seltsame Funktionalität auf Windows. Ich öffne die Befehlszeile und führe das Skript aus ("python myscript.py"). Das Skript wird beendet, aber nicht beendet (wird im Task-Manager überprüft). Es wird nicht neu gestartet, es sei denn, ich drücke zweimal die Eingabetaste. Ich möchte, dass es automatisch funktioniert.

Irgendwelche Vorschläge? Danke für Ihre Hilfe!

import threading 
import time 
import subprocess 
import os 
import sys 

if __name__ == '__main__': 
    print("Starting thread list: " + str(threading.enumerate())) 

    for _ in range(3): 
     time.sleep(1) 
     print("Sleeping") 

    ''' Attempt 1 with subprocess.Popen ''' 
    # child = subprocess.Popen(['python',__file__], shell=True) 

    ''' Attempt 2 with os.execv ''' 
    args = sys.argv[:] 
    args.insert(0, sys.executable) 
    if sys.platform == 'win32': 
     args = ['"%s"' % arg for arg in args] 
    os.execv(sys.executable, args) 

    sys.exit() 

Antwort

0

Klingt wie Sie Einfädeln in Ihrem ursprünglichen Skript verwenden, was erklärt, warum Ihr nicht Ihre ursprüngliche Skript brechen können, wenn sie nur Drücken von Strg +C. In diesem Fall sollten Sie eine KeyboardInterrupt Ausnahme zu Ihrem Skript hinzuzufügen, wie folgt aus:

from time import sleep 
def interrupt_this() 
    try: 
     while True: 
      sleep(0.02) 
    except KeyboardInterrupt as ex: 
     # handle all exit procedures and data cleaning 
     print("[*] Handling all exit procedures...") 

Danach sollten Sie in der Lage sein, automatisch die entsprechenden Verfahren neu zu starten (auch aus dem Skript selbst, ohne äußere Skripte). Wie auch immer, es ist ein bisschen schwierig zu wissen, ohne das relevante Skript zu sehen, also kann ich vielleicht mehr helfen, wenn Sie etwas davon teilen.

+0

Danke für die Antwort! Das Problem, das ich habe, ist nicht mit Skript, das nicht angezeigt wird, sondern mit dem Code, der gepostet wird. Es stellt sich heraus, dass es gut funktioniert, wenn ich das Skript doppelt in Windows laufe, aber wenn ich "python myscript.py" von der Kommandozeile aus tue, funktioniert es nicht. Keine aktuellen Probleme in Linux. – NJC

Verwandte Themen