2014-11-27 5 views
8

Meine Frage ist einfach: Kann ich expect() bestimmte Ausgabe auf stderr mit Pexpect sehen? Es scheint pexpect.spawn() kann nur verwendet werden, um Ausgabe auf stdout zu erwarten.Extrahieren von Stderr von Pexpect

utopisches Beispiel:

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

oder in Prosa, "erwartet den String 'hallo' auf stderr".

Ich habe keine Erwähnung einer solchen Anlage in der Dokumentation gefunden, aber ich beachten Sie, dass die child Instanz ein stderr Attribut ...

Ein Hack, die halb erreicht, was ich will, ist stderr zu umleiten Um in den Spawn-Argumenten zu stdout, können wir reguläre expect() verwenden. Es muss einen besseren Weg geben?

Prost

+2

Pexpect läuft Ihr subprocess in einem pty, so dass alle Standard-Streams (stdin, stdout und stderr) werden auf diesen pty hingewiesen, und der steuernde Prozeß schreibt in diesen einzelnen pty und liest von diesem. Es hat keinen Zugriff auf stdout und stderr separat: Sie werden in der Ausgabe verschachtelt, wie der Prozess in einem regulären Terminal ausgeführt wird. Wenn Sie einen separaten Zugriff benötigen, können Sie den Prozess mit 'subprocess.Popen' starten und dann' pexpect.fdpexpect.fdspawn' verwenden, um nur eine der Pipes zu betrachten. –

+0

Danke. Das klingt, als würde es funktionieren. Haben Sie ein Beispiel und ich werde es als die Antwort markieren :) –

Antwort

2

Für die Nachwelt und auf der Grundlage der Kommentar von Thomas K, das, was Sie wollen zu tun scheint:

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

sollten Sie wahrscheinlich 'stdin = DEVNULL' verwenden, wenn Sie nicht schreiben' command.stdin' (übergeben '' r + b'' zu 'öffnen () ') – jfs