2010-09-30 19 views
5

Sto provando a usare Python (tramite il framework Django) per effettuare una chiamata da riga di comando Linux e ho provato sia os.system che os.open ma per entrambi sembra che lo script Python si blocchi dopo aver fatto la chiamata da linea di comando come la chiamata serve per creare un'istanza di un server (quindi non "finisce mai" come se volesse essere di lunga durata). So che per fare qualcosa di simile con un altro codice Python puoi usare qualcosa come il sedano, ma ho pensato che ci sarebbe stato un modo semplice per farlo semplicemente effettuare una chiamata dalla riga di comando e non essere "legato" per poterlo spostare passato, mi chiedo se sto facendo qualcosa di sbagliato ... grazie per qualsiasi consiglio.Python, usando os.system - C'è un modo per lo script Python per superare questo senza aspettare che la chiamata finisca?

Sto facendo la chiamata come questo momento

os.system("command_to_start_server") 

cercato anche:

response = os.popen("command_to_start_server") 

risposta

9

Non sono sicuro, ma credo che con la sua the subprocess module Popen è molto più flessibile di os.popen. Se ricordo bene, include la generazione di processi asincroni, che penso sia ciò che stai cercando.

Edit: E 'stato un po' che ho usato il modulo sottoprocesso, ma se non mi sbaglio, subprocess.Popen restituisce immediatamente, e solo quando si tenta di comunicare con il processo (come la lettura la sua uscita) usando subprocess.communicate il tuo programma blocca in attesa dell'output se non ce n'è.

+0

grazie, sembra una soluzione migliore di quello che stavo facendo ... c'è qualche strano " legando "il tipo di comportamento in corso quando faccio in modo che la linea di cmd chiami il modo in cui ero attraverso un oggetto avviato originariamente da Django, la chiamata che stavo facendo sulla linea cmd era quella di avviare un altro server di test (sulla porta diff) ma in qualche modo legato al server di prova Django dove causa il fallimento del server di prova Django anche se normalmente posso eseguirli entrambi contemporaneamente quando li avvio manualmente dalla linea cmd – Rick

0

Prova:

os.system("command_to_start_server &>/dev/null &") 
+0

Grazie, ha funzionato anche se ha ancora un comportamento strano come la pagina di output in Django (anche se mostra l'output finale) continua a mostrare "Caricamento" a tempo indeterminato ... ma facendo quello che hai detto è passato la parte in cui era "sospeso" – Rick

+0

ora reindirizza l'intero output a/dev/null, quindi niente verrà mostrato nella pagina – tamasd

Problemi correlati