2010-01-21 14 views
8

Sto scrivendo un programma Python che, se l'utente modifica le impostazioni durante l'esecuzione, deve essere riavviato per applicare le impostazioni modificate. C'è un modo per farlo? Sto pensando qualcosa sulla falsariga di:Riavvia un programma Python

import sys 
command_line = ' '.join(sys.argv) 
# Now do something with command_line 
# Now call my custom exit procedure 

Nota: Sono su Windows, se questo fa la differenza

+0

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

+0

correlati: [? E 'possibile impostare il python -O (optimize) bandiera all'interno di uno script] (http://stackoverflow.com/q/7527055/4279) – jfs

risposta

8

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:

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

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

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

5

Su Unix, è possibile utilizzare os.execl famiglia di funzioni:

Queste funzioni tutti eseguono un nuovo programma, che sostituisce l'attuale processo; non tornano. Su Unix, il nuovo eseguibile viene caricato nel processo corrente e avrà lo stesso ID di processo del chiamante. Gli errori verranno segnalati come eccezioni OSError.

Su Windows, un'occhiata al os.spawnl famiglia, che sono meno efficienti rispetto alla unix chiama.

+0

'os.execl() 'funziona anche su Windows. – jfs

Problemi correlati