2014-11-27 16 views
8

Soruma basit: pexpect kullanarak stderr'deki belirli çıktıları görmek için expect() yapabilir miyim? Görünüşe göre pexpect.spawn() sadece stdout üzerindeki çıkışı beklemek için kullanılabilir.Pexpect'ten stderr ayıklanıyor

ütopik örnek:

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

Ya nesir

, "standart hataya dize 'hi' bekliyoruz."

Ben dokümanlar böyle bir tesisin herhangi bir söz bulamadım ama child örneği bir stderr niteliği sahip olduğuna dikkat do ... İstediğimi yarı başarır

Bir kesmek stderr'yi yöneltmek olan spawn argümanlarında stdout yapmak için normal expect()'u kullanabiliriz. Daha iyi bir yol olmalı?

Alkış

kuşaklar için
+2

pexpect bir pty içinde alt işlemi çalışır, bu nedenle tüm standart akışları stdout ve stderr) bu pili işaret eder ve kontrol süreci bu tek pty'ye yazar ve okur. Stdout ve stderr 'e ayrı ayrı erişemez: Prosesin normal bir terminalde çalıştırılması gibi çıkışta ara verilir. Ayrı erişime ihtiyacınız varsa, işlemi "subprocess.Popen" ile başlatabilir ve daha sonra sadece bir boruya bakmak için "pexpect.fdpexpect.fdspawn" komutunu kullanabilirsiniz. –

+0

Teşekkürler. İşe yarayacak gibi geliyor. Bir örneğiniz var mı ve cevap olarak işaretleyeceğim :) –

cevap

2

ve Thomas K tarafından Yorum dayalı, bu ne istediğinizi yapmak görünüyor: stdin'nin (

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

muhtemelen 'stdin = DEVNULL' komutunu kullanmanız gerekiyorsa '' komut.stdin '' yazmıyorsanız ('r + b''' açmak) ') – jfs