2013-07-24 6 views
0

다음 호출을 사용하여 프로세스를 생성하고 stdin, stdout 및 stderr에 대한 파일 설명자를 가져 와서 stdout에서 출력을 감시합니다.pygtk/gnome의 gobject.spawn_async가 반환하는 파일 설명자를 어떻게 플러시 할 수 있습니까?

[widget.pid,widget.stdin,widget.stdout,widget.stderr] = \ 
      gobject.spawn_async(['/bin/sed','s/hi/by/g'], 
           standard_input=True, 
           standard_output=True, 
           standard_error=True 
           ) 
gobject.io_add_watch(widget.stdout, 
         gobject.IO_IN, 
         getdata) 

그런 다음 getdata 콜백 함수를 트리거 할 것으로 예상되는 행을 widget.stdin에 씁니다.

내가 발견 한 것은 콜백 getdata는 widget.stdin을 닫을 때만 호출된다는 것입니다.

터미널에서, sed는 stdin으로 보낸 각 완성 된 줄을 반향합니다. 그래서 나는 sd가 출력 된 내용을 stdin에서 볼 때마다 출력을 생성하고 줄을 얻지 못할 것으로 예상합니다. 한번에 한.

widget.stdin에 작성된 행을/bin/sed에서 강제로 표시하고 연결을 열어 더 많은 행을 보낼 수 있도록하는 방법이 명확하지 않습니다. python -u 플래그는 아무런 차이가없는 것처럼 보입니다. 어떤 아이디어? 감사.

답변

0

나는 틀린 질문을 할지도 모른다 생각한다; 나는 이것을 다른 제목으로 제출할 것이다.

내가 아는 것은 아이의 파이프가 가득 찼을 때만 아이의 stdout이 부모에서 트리거된다는 것입니다. 즉, 자식 ("sed"프로세스)은 파이프가 채워질 때까지 실제로 아무런 입력도받지 못하는 것처럼 보입니다. 파이프 크기를 4096으로 설정하고 4096 바이트의 자식 파이프를 미리 채우면 512 바이트의 청크를 보낼 수 있고 상위 프로세스 인 'io_add_watch 콜백 (최대 512 바이트까지 읽을 수 있음)이 새 청크를 보낼 때마다 호출됩니다. 아이에게.