2014-11-27 15 views
8

La mia domanda è semplice: Posso expect() vedere determinati output su stderr usando pexpect? Sembra che pexpect.spawn() possa essere utilizzato solo per aspettarsi output su stdout.Estrazione di stderr da pexpect

esempio utopistico:

import pexpect child = pexpect.spawn(...) child.expect("hi", fd=pexpect.STDERR)

O in prosa, "prevedere la stringa 'ciao' su stderr".

non ho trovato alcuna menzione di un tale impianto nella documentazione, ma io notare che l'istanza child ha un attributo stderr ...

Un hack che semi-realizza quello che voglio è quello di reindirizzare stderr per stdout negli argomenti spawn, quindi possiamo usare regolare expect(). Ci deve essere un modo migliore?

Acclamazioni

+2

Pexpect esegue il sottoprocesso in un PTY, in modo che tutti i flussi standard (stdin, stdout e stderr) sono puntati su quella pty e il processo di controllo scrive e legge da quella singola pty. Non ha accesso allo stdout e allo stderr separatamente: saranno interfogliati in output, come l'esecuzione del processo in un terminale normale. Se hai bisogno di un accesso separato, puoi avviare il processo con 'subprocess.Popen' e quindi usare' pexpect.fdpexpect.fdspawn' per esaminare solo uno dei tubi. –

+0

Grazie. Sembra che funzionerà. Hai un esempio e lo contrassegnerò come risposta :) –

risposta

2

Ai posteri, e sulla base del commento di Thomas K, questo sembra fare quello che vuoi:

import os 
import subprocess 
from pexpect import fdpexpect 

program = ['/path/to/command', '--arg1', 'value1', '--arg2', 'value2'] 
devNull = open(os.devnull, 'w') 
command = subprocess.Popen(program, stdout=devNull, 
          stdin=subprocess.PIPE, stderr=subprocess.PIPE) 
child = fdpexpect.fdspawn(command.stderr) 
child.expect('hi') 
+0

probabilmente dovresti usare 'stdin = DEVNULL' se non scrivi a' command.stdin' (passa ''r + b'' a' open () ') – jfs