2014-11-27 5 views
8

내 질문에 간단합니다 : expect() pexpect를 사용하여 stderr에서 특정 출력을 볼 수 있습니까? pexpect.spawn()은 stdout에서 출력을 기대하기 위해서만 사용될 수 있습니다.pexpect에서 stderr을 추출하는 중

유토피아 예 :

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

또는 산문

, "stderr에 문자열을 '안녕하세요'기대".

나는이 문서에서 이러한 시설에 대한 언급을 발견하지 않은,하지만 난 child 인스턴스가 stderr 속성이 있습니다 않아 ... 내가 원하는 반 달성

해킹은 표준 오류 리디렉션하는 것입니다 스폰 인수에서 stdout하려면 정규 expect()을 사용할 수 있습니다. 더 좋은 방법이있을거야?

건배

후손을 위해
+2

Pexpect가 PTY에서 하위 프로세스를 실행하여 모든 표준 스트림, stdout과 stderr)는 해당 pty를 가리키고, 제어 프로세스는 해당 단일 pty에 쓰고 읽습니다. 그것은 stdout과 stderr에 따로 따로 접근 할 수 없다 : 그들은 표준 터미널에서 프로세스를 실행하는 것처럼 출력으로 인터리브 될 것이다. 별도의 액세스가 필요한 경우'subprocess.Popen'을 사용하여 프로세스를 시작한 다음'pexpect.fdpexpect.fdspawn'을 사용하여 파이프 중 하나만 볼 수 있습니다. –

+0

감사합니다. 그게 효과가있는 것처럼 들리네. 예를 들어 답을 표시 할 것입니다 :) –

답변

2

Thomas K에 의해 코멘트를 기반으로, 이것은 당신이 원하는 것을 할 것 같다 : 표준 입력 (

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

'command.stdin'에 쓰지 않으면'stdin = DEVNULL'을 사용해야합니다 ('r + b'를'open)') – jfs

관련 문제