2009-12-18 3 views
2

subprocess.Popen 객체를 사용하여 여러 하위 프로세스를 실행하는 Python 응용 프로그램을 작성하고 있습니다. 나는 glade GUI를 가지고 있으며 gui에서 실시간으로 이러한 명령의 출력 (subprocess.Popen에서 실행 됨)을 표시하려고합니다.쉘 프로세스의 출력을 표시하는 Python GUI (glade)

누구든지이 방법을 제안 할 수 있습니까? 어떤 글래스 오브젝트를 사용해야하고 출력을 리디렉션 할 수 있습니까?

답변

1

많은 읽기와 결과를 얻지 못한 후 작동하는 다른 방법을 찾았습니다.

그것은 다음은이

#!/usr/bine/env python 
import subprocess 
import gtk 

### Of course, you should have the gui built and know which widgets to use for this. 
viewer = self.builder.get_widget('txtview') 
proc = subprocess.Popen('ls -al /home'.split(), stdout=subprocess.PIPE, stderr = subprocess.STDOUT) 
while True: 
    line = proc.stdout.readline() 
    viewer.get_buffer().instert_at_cursor(line) 
    if not line: 
     break 
1

빈터 당신이 빈터 객체를 요청할 때 어쩌면 당신이이 경우 textbuffer GTK 위젯과에 요청해야하고 텍스트 뷰가 해결책이 될 아니면 트 리뷰 및 liststore chould GTK와 GUI를 구축하는 유일한 프로그램입니다. subprocess.Popenstdoutstderr 개의 파일과 유사한 객체를 허용 할 수있는 인수를가집니다. 텍스트 버퍼에 쓰거나 목록 저장소에 항목을 추가하는 어댑터를 만들 수 있습니다.

+0

나는 고쳤다. 나는 gtk 위젯을 사용했다. 이제이 어댑터에 대해 자세히 설명해 주시겠습니까? stdout과 stderr를 지속적으로 읽고 그것을 gtk 위젯에 쓰는 타이머 객체를 의미합니까? 아니면 뭔가 다른 점이 있습니까? –

+0

나는 Popen이 file-object에 출력을 쓰는 대신에 .fileno() 메서드와 os.fdopen()을 해당 파일 설명자에 사용한다고 생각하고있었습니다. 이유는 모르겠습니다. 따라서 프로세스가 종료 될 때까지 메모리의 모든 출력을 읽는 .communicate()를 사용할 수 있습니다. 이것이 옵션이 아니라면, PIPE를 사용하고 항상 스레드에서 읽을 수 있습니다. 이게 더 도움이 되었으면 좋겠다. –

관련 문제