2016-05-18 12 views
0

Ich habe ein Python-Skript namens "prog.py". Ich möchte ein Feature hinzufügen, das einen neuen Prozess öffnet, der den Betrieb des aktuellen Skripts überwacht. Wenn das Skript beendet wird, erkennt der Prozess die Beendigung und ruft dann eine bestimmte Funktion auf. Hier ist ein Pseudo-Code:Erstellen eines Prozesses in Python, der nach dem Hauptprozess endet

while (script is active):  

    sleep(1) # check its status once a second 

func() 

Haben Sie eine Idee, wie es geht?

Antwort

1

Gibt es einen Grund, warum der andere Prozess zuerst gestartet werden muss? Es scheint, als könnten Sie dies effizienter und zuverlässiger machen, indem Sie einfach execing eingeben, wenn der erste Prozess abgeschlossen ist. Zum Beispiel:

import atexit 
import os 

atexit.register(os.execlp, 'afterexitscript.py', 'afterexitscript.py', 'arg1', 'arg2') 

Wenn die aktuelle Python-Prozess beendet, wird sie ersetzen sich nahtlos mit der anderen Skript, das nicht die Mühe machen müssen eine Abfrageschleife einschließlich. Oder du könntest einfach atexit verwenden, um func direkt in deinem Hauptskript auszuführen und einen neuen Python-Start zu vermeiden.

+0

+1 für den letzten Satz. Verwenden Sie einfach "atexit", und kümmern Sie sich nicht um Prozesse, es sei denn, Sie haben einen bestimmten Grund. –

+0

Das Problem ist mit dem folgenden Hinweis in Atexit-Dokumentation: "Die über dieses Modul registrierten Funktionen werden nicht aufgerufen, wenn das Programm durch ein Signal nicht von Python, wenn ein schwerwiegender interner Python-Fehler erkannt wird oder wenn os._exit erkannt wird() wird genannt." Ich bin auf der Suche nach einer Lösung, die in jedem Fall von Skript Beendigung funktionieren ... – CrazySynthax

+0

@CrazySynthax: In diesem Fall wäre es noch einfacher, den Monitor-Prozess verwalten den "Haupt" -Prozess, anstatt die "Main "einen Monitor laufen lassen, der dann versucht, den Hauptprozess zu überwachen. Ersteres ist eine tote einfache Verwendung von "Subprozess", letzteres beinhaltet im Allgemeinen nicht-portable OS-spezifische Prozessabtrennungsschritte und "tightarole". – ShadowRanger