2011-03-27 11 views
0

왜 내 자신의 클래스로 sub.Popen.stdout이 아닌 sys.stdout을 오버라이드 할 수 있습니까? 오버라이드 할 수있는 방법을 알려주십시오.파이썬, 왜 Popen.stdout을 오버라이드 할 수 없습니까?

저는 GUI 프로젝트에서 작업 중이며 모든 것이 완료되었을 때가 아니라 "real_time"의 text_view에서 다른 프로그램의 출력을 인쇄하려고합니다. 나는 이런 식으로 뭔가를해야만 할 sys.stdout 내가 무시하고

:

import subprocess as sub 

def main() : 
    popen = sub.Popen('./pyscript.py', stdout=sub.PIPE) 
    for line in popen.stdout : print 'Line :', line 
    print 'Main done' 

if __name__ == '__main__' : main() 
: 여기
class MyStdOut : 
    def __init__(self) : self.text = "" 
    def write(self, string) : self.text += string 

여기

import os 

def main() : 
    for i in range(10) : 
    print i 
    os.system('sleep 0.1') ## this is just to make some delay, i did also 3 loops 

if __name__ == '__main__' : main() 

일부 프로그램 'pyscript.py'는 메인 프로그램입니다

아직도 '실시간'이 아니며, 끝나면 모든 것을 얻습니다.

나는 또한 의사 소통을 시도했지만 같은 결과를 얻는다.

내 실제 프로그램에서는 text_view (GUI GTK +)에 다른 프로그램의 출력물을 인쇄해야합니다. 나는 subprocess.stdout 파일을해야합니다 용의자지만 내가 너무 오류가있어 IOBase에서 상속 일부 클래스를 만들려고 할 때.

모두가 가능하다고 말하지만 여전히 많은 성공을 거두었습니다.

+1

이 코드는 sys.stdout을 덮어 쓰는 것과 관련이 있습니까? 이것은 sys.stdout과 전혀 관련이없는 클래스입니다. 스트림을 구현하는 것은 write()를 구현하는 것 이상의 것입니다. 당신이 해결하려고하는 실제 문제는 무엇입니까? 정확하고 장황하게하십시오 - 그렇지 않으면 당신의 질문은별로 의미가 없습니다. –

답변

2

당신은 사용하여 동일한을 얻을 수 있습니다

p = Popen(args, ..., stdout=subprocess.PIPE) 
for line in p.stdout: 
    print line 

p.stdout 동작합니다 PIPE처럼, 당신은 빨리 도착하는대로 그것에서 데이터를 읽을 수 있습니다. 일부 버퍼링이 작동하기 때문에 엄격한 실시간이 아니지만 여전히 실용적인 대안입니다.

+0

아직 아무 것도 결과가 같지 않습니다. 모든 것이 끝나면 출력이 나옵니다. – user679135

+0

코드를 게시 할 수 있습니까? – pajton

+0

나는 그것을 게시했다. – user679135

관련 문제