2014-09-28 3 views
0

하위 프로세스의 stderr 및 stdout에서 읽는 방법에 대해 많은 질문이 있습니다. 현재 프로세스의 stderr로 그렇게 할 수 있습니까? 나는 그것을 검사하고 IO Error를 발생 시켰습니다 : 파일을 열어서 읽을 수 없습니다.Python의 sys.stderr에서 읽기

stderr을 읽고 추가 처리를 위해 데이터를 가져와야했습니다. 'r +'모드에서 파일을 여는 방법이 있습니까?

class CustomStdErr(object): 
    def write(self, data): 
     with open(fakestderr, 'r+') as f: 
      f.write(data) 

sys.stderr = CustomStdErr() 

더 직접 할 수있는 다른 방법이 있습니까 : 내가 생각

한 가지 방법은 같은 클래스와 기본 sys.stderr를을 무시했다?

편집 : 나는 열려진 필요한 이유:
스레드가있다을 (를 호출 X) 메인 쓰레드와 상호 작용하는 코드 (M 호출). 주 스레드에서 로깅을 사용할 수 있습니다. 이것은 stderr로 재 지정됩니다. 이제 스레드 X의 의무는 stderr를 모니터링하고 을 읽고을 읽고 주 스레드에 대해 처리합니다. 요약하면, 이것은 무엇이 일어나고 있는지입니다.

+2

이것은 실제로 XY 문제. 자신의 프로세스가 쓰고있는 stderr을 왜 읽고 싶은지 명확히 할 수 있습니까? – Korem

+0

@Korem 편집을했습니다 –

+0

당신이 제안한 방법을 가정하면, CustomStdErr'을'cStringIO'와 함께 사용합니다. –

답변

2

음 원하는대로 직접 할 수는 없습니다. 하나의 스레드가 기본값 인 sys.stderr에 쓰는 경우 기본적으로 스레드는 터미널로 이동하므로 다른 스레드가이를 읽을 수 없습니다.

하지만 ... 당신은 항상 표준 파이썬 라이브러리 sys 모듈의 문서에서 문자열 인수 (추출물을 복용 write 방법이있는 개체에 sys.stderr을 변경할 수 있습니다 stderr 내장 할 필요는 없다 파일 객체 : 문자열 인수를 취하는 write() 메소드를 가진 객체이면 허용됩니다 (이 객체를 변경하더라도 os 모듈에있는 os.popen(),,,또는 exec*() 함수 군에 의해 실행되는 프로세스의 표준 I/O 스트림에는 영향을주지 않습니다.))

간단히 말해서 : 직접 쓰다면 sys.stderr에의, 당신은 sys.stderr에 대한 쓰기 종료에 영향을 os.pipe()와 파이프의 쌍을 만들 수 있습니다, 모니터링 스레드에서 읽을 끝을 읽을 - 아직도 당신이 출시 스레드 경우 sys.__sterr__ 또는 sys.stderr

의 저장된 값에 쓸 수있는 것보다 subprocesses를 사용하려면 subprocess.Popen 개체를 사용하여 하위 명령의 stderr 스트림을 파이프로 리디렉션하고 모니터링 스레드에서 읽습니다.

0

* ix에서 대화 형 프로세스가있는 경우 ('/ dev/tty', 'r') 열 수 있습니다. 이것은 stderr에서 읽는 것과 유사합니다. Open ('/ dev/tty', 'r +')은 2.x에서만 작동하며, 3.x에서는 열려야합니다 ('/ dev/tty', 'r').