2013-01-21 2 views
5

Sto lottando per utilizzare i sottoprocessi con python. Qui è il mio compito:Uso di python con sottoprocesso Popen

  1. avviare un api tramite la riga di comando (questo dovrebbe essere differente che l'esecuzione di qualsiasi argomento sulla riga di comando)
  2. verificare la mia API ha messo a punto. Il modo più semplice per farlo sarebbe quello di sondare lo standard.
  3. Eseguire un comando contro l'API. Un prompt dei comandi appare quando sono in grado di eseguire un nuovo comando
  4. Verificare il completamento del comando tramite il polling lo standard out (l'API non supporta la registrazione)

Quello che ho provato finora:
1 Sono bloccato qui usando il Popen. Capisco che se io uso subprocess.call("put command here") questo funziona. Ho voluto provare ad usare qualcosa di simile a:

import subprocess 

def run_command(command): 
    p = subprocess.Popen(command, shell=True, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.STDOUT) 

dove io uso run_command("insert command here"), ma questo non fa nulla.

rispetto a 2. Penso che la risposta dovrebbe essere simile a qui: Running shell command from Python and capturing the output, ma non riesco a 1. al lavoro, non ho provato ancora.

risposta

7

Per avviare veramente il sottoprocesso, è necessario comunicare all'oggetto Popen di comunicare realmente.

def run_command(command): 
    p = subprocess.Popen(command, shell=True, 
      stdout=subprocess.PIPE, 
      stderr=subprocess.STDOUT) 
    return p.communicate() 
6

È possibile guardare in Pexpect, un modulo specificamente progettato per interagire con i programmi di shell-based.

Per esempio il lancio di un comando scp e in attesa di Richiesta password che fate:

child = pexpect.spawn('scp foo [email protected]:.') 
child.expect ('Password:') 
child.sendline (mypassword) 

Vedi Pexpect-u per una versione Python 3.

+2

Giusto per aggiungere che, AFAICT, il sottoprocesso modulo è veramente orientato verso le attività che vengono eseguite con il loro input iniziale e quindi complete (come richiamare una funzione). Se hai bisogno di un continuo avanti e indietro (ad esempio per un'utilità di terminale interattiva), allora Pexpect è * sicuramente * la strada da percorrere. – TimStaley