2010-06-08 15 views
16

Sto provando a scrivere una piccola app che utilizza il modulo subprocess.Utilizzo del sottoprocesso wait() e sondaggio()

Il mio programma chiama un comando Bash esterno che richiede del tempo per l'elaborazione. Durante questo periodo, vorrei mostrare all'utente una serie di messaggi come questo:

Elaborazione. Attendere ...
L'uscita è foo()

Come posso fare questo usando Popen.wait() o Popen.poll(). Ho letto che ho bisogno di usare il Popen.returncode, ma come posso farlo controllare attivamente lo stato, non lo so.

risposta

16

Sia wait() (con timeout specificato) e poll() ritorno None se il processo non è ancora finito, e qualcosa di diverso se il processo ha finito (penso che un numero intero, il codice di uscita, si spera 0).

Edit:

wait() e poll() hanno comportamenti diversi:

  • wait (senza l'argomento timeout) sarà bloccare e attendere il completamento del processo.
  • wait con l'argomento di timeout attenderà timeout secondi per il completamento del processo. Se non viene completato, verrà generata l'eccezione TimeoutExpired. Se rilevi un'eccezione, allora sei libero di andare avanti o di nuovo su wait.
  • poll restituisce sempre immediatamente. Effettua effettivamente un'attesa con un timeout di 0, rileva qualsiasi eccezione e restituisce None se il processo non è stato completato.
  • Con entrambi wait o poll, se il processo è stato completato, sarà impostato il returncode oggetto popen (altrimenti c'è nessuno - è possibile verificare la presenza di quella stessa facilità con cui chiamare wait o poll), e il valore restituito dalla funzione sarà anche essere il codice di ritorno del processo.

</Modifica>

Quindi penso che si dovrebbe fare qualcosa di simile:

while myprocess.poll() is None: 
    print("Still working...") 
    # sleep a while 

essere consapevoli che se lo script bash crea un sacco di uscita è necessario utilizzare communicate() o qualcosa simile a prevenire stdout o stderr per diventare farcito.

+0

Sto usando comunicare(). Ma non capisco come posso restituire il codice di ritorno mentre il processo è in esecuzione. – user225312

+0

Ho risolto questo problema: if process.poll() è None: print 'Working' – user225312

+4

Questa risposta è errata. Controlla @ onlynone's answer –

23

@ la risposta di extraneon è un po 'indietro. Entrambi wait() e poll() restituiscono il codice di uscita del processo se il processo è terminato.Il metodo poll() restituirà None se il processo è ancora in corso e il metodo wait() bloccherà fino a quando il processo si chiude:

controllare il seguente pagina: https://docs.python.org/3.4/library/subprocess.html#popen-objects

Popen.poll()

Controllare se il processo figlio ha terminato. Imposta e restituisci l'attributo returncode.

Popen.wait()

Attendere che il processo figlio per terminare. Imposta e restituisci l'attributo returncode.