Vorrei bypassare tutta l'angoscia è molto probabile che per ottenere da cercando di ri -runora te stesso e lascialo nelle mani dell'ambiente.
Con questo, voglio dire:
disporre di un programma di controllo, che non fa altro che eseguire il programma (con gli stessi parametri è stato dato) in un ciclo mentre il programma esce con uno specifico restart" " codice. Questo potrebbe essere semplice come un file cmd
o complesso come un altro (molto semplice) programma Python che utilizza os.system
). Fondamentalmente, finché il programma di controllo ottiene il "riavvio" del codice, eseguirà nuovamente il tuo programma con esattamente gli stessi parametri. Qualsiasi altro codice causerà l'uscita con quel codice.
Quando si desidera uscire completamente, far uscire il proprio vero programma Python con codice di ritorno 0 (o qualsiasi cosa che non sia il codice di "riavvio" in una situazione di errore).
Se si vuole solo ciclo all'altro iterazione del vostro programma (a rileggere la configurazione, ad esempio), l'uscita con il codice "restart" riconosciuta dal programma di controllo.
Ma si potrebbe anche voler pensare a reingegnerizzare l'applicazione in modo che possa rileggere la sua configurazione in qualsiasi momento. Questo farà scomparire l'intero problema. Non dici perché non è un'opzione, quindi presumo che tu abbia qualche motivo per cui non funzionerà.
Ma se non lo fai, questo è il percorso che sceglierei.
Per fornire alcuni esempi di codice per la prima opzione (questo è su Windows ma sotto Cygwin - le stesse regole di base dovrebbero applicarsi per Python nativo di Windows, ma si dovrebbe controllare i valori restituiti dalla os.system
) .:
> cat phase1.py
#!/usr/bin/python
import os
status = 9
while status == 9:
status = int(os.system ("./phase2.py")/256) # exit code is upper 8 bits
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 "Program: %d -> %d"%(val,rc)
sys.exit(rc)
> ./phase1.py
Program: 2 -> 9
Controller: 9
Program: 3 -> 9
Controller: 9
Program: 4 -> 9
Controller: 9
Program: 5 -> 9
Controller: 9
Program: 7 -> 9
Controller: 9
Program: 8 -> 9
Controller: 9
Program: 9 -> 9
Controller: 9
Program: 0 -> 0
Controller: 0
È possibile visualizzare il controller utilizzando un codice di uscita 9 per decidere se rieseguire il programma. Il programma è di per sé uno stupido che restituisce 9 a meno che non sia su un multiplo di 10 secondi.
su UNIX processi in background in genere utilizzano gestori di segnale, prova anche modulo di segnalazione in python. Probabilmente si potrebbe fare lo stesso in Windows – Anycorn
correlati: [? E 'possibile impostare il python -O (optimize) bandiera all'interno di uno script] (http://stackoverflow.com/q/7527055/4279) – jfs