2012-07-23 12 views
15

Non capisco perché sia ​​così difficile farlo su Windows.Python: Avvia il nuovo prompt dei comandi su Windows e attendi che finisca/esca

Voglio generare una serie di finestre del prompt dei comandi che eseguiranno altri script. La ragione per cui voglio questo è che posso vedere tutti gli output di ogni script in modo ordinato (se li ho appena sono thread/processi secondari nella finestra principale non riesco a visualizzare correttamente tutti gli output). Inoltre, non voglio registrare l'output perché è principalmente per visualizzare le barre di avanzamento, che in realtà non funzionano con i file di registro.

parti Quindi individuali delle mie esigenze di lavoro, ma non insieme:

os.system("start cmd /c {command here}")  # Launches in new command prompt, closes when done 

Tuttavia, il sistema operativo non mi lascia attendere il termine del comando (da inizio è il comando vero e proprio, il secondo si apre la nuovo prompt dei comandi che è "fatto")

Allo stesso modo se provo:

p = subprocess.Popen(["start", "cmd", "/k", "{command here}], shell = True) # Needs to be shell since start isn't an executable, its a shell cmd 
p.wait() # I can wait until finished (although it too finishes after start finishes) 

Allora, come faccio a fare questo? Ho letto da qualche parte che una soluzione potrebbe essere usare processgroup ma è unix solo .... o qualcosa del genere

Oppure, se si dispone di un modo pulito per visualizzare l'output da tutti i sottoprocessi in una singola finestra, allora non Non è necessario aprire un nuovo prompt dei comandi e utilizzare semplicemente i thread. Anche questo funziona, ma se ho lasciato dire 4 thread scaricando qualcosa e visualizzando una barra di avanzamento oltre che emettere altre informazioni non so come visualizzarlo in un modo che possa essere letto (oltre a evitare che si scontrino tutti con l'un l'altro).

PS: Questo è in Windows Vista. PPS: preferirei una soluzione che funziona su Windows, Linux e Mac, per ora mi sto concentrando su Windows ma mi piacerebbe una soluzione che funzioni per tutti e tre, e so che Windows è il più pignolo. Sostituirei semplicemente "start cmd/c" per il comando appropriato del sistema operativo.

+0

C'è una ragione che si sta utilizzando 'start' VS utilizzando 'cmd' come il vostro comando? – Joe

+0

Solo il modo in cui ho trovato di aprire un nuovo prompt dei comandi, se c'è un altro modo che va bene – robev

risposta

24

Dopo aver letto il tuo commento e la mia risposta precedente quello che vi serve è:

os.system("start /wait cmd /c {command}") 

Tenere the windows command reference sempre a portata di mano!

1

Come su

os.system("cmd /c {command here}") 

O anche

os.system("{command here}") 

E 'l'inizio comando quello che sta lanciando una sessione separata invece di utilizzare lo stesso programma Python è in esecuzione.

+0

Che non avvia una nuova finestra del prompt dei comandi, lo esegue nella finestra corrente – robev

4

È possibile passare/ATTENDERE al comando start per farlo attendere la chiusura.

2

Per aprire una nuova finestra del prompt dei comandi che uso:

os.system("start /B start cmd.exe @cmd /k mycommand...") 
Problemi correlati