2015-02-05 2 views
0

Linux Mint에서 실행되는 Gtk + 3.10.8을 사용하는 Python 2.7의 GUI 응용 프로그램이 있습니다.파이썬에서 c 라이브러리 stdout 메시지 리디렉션

응용 프로그램은 비디오 플레이어를 임베드하기 위해 libvlc 라이브러리의 파이썬 바인딩을 사용합니다. libvlc 라이브러리는 비디오 처리에 libav를 사용합니다.

제 문제는 libav가 매우 장황하고 경고의 상수 스트림이 생성된다는 것입니다. libvlc는 자세한 정보를 변경하거나 억제하는 메커니즘을 제공하지 않습니다.

물론, 하나는 (예를 들어)하여 파이썬 스크립트를 실행하여 소음을 해제 할 수 있습니다

$ ./myprogram.py &> /dev/null 

나는 프로그램 내에서 프로그램 같은 효과를 얻을 수 있도록하고 싶습니다. 외부 라이브러리의 모든 액세스를 stdout으로 단순히 억제하는 것이 좋겠지 만 궁극적으로는 출력을 캡처하고 일부 로깅을 구현하는 것이 좋습니다.

이 주제에서 찾을 수있는 모든 예는 외부 프로세스를보다 직접적으로 제어 (예 : 하위 프로세스로 선언)하는 것으로 가정합니다. 파이썬 코드에서 실제 라이브러리 (libav)에 직접 액세스 할 수 없을 때 다른 방법이 있습니까?

편집 : 모두의 도움 덕분에 정답은 Python version of freopen(), 대답 # 3에서 찾을 수 있습니다.

어떤 방식 으로든 stdout을 방해하는 IDE에서 코드를 실행하지 않도록하십시오. 대화 형 십오 그렇게하는 경향과 같은 오류가 발생합니다 :

AttributeError: FileWrapper instance has no attribute 'fileno' 

답변

0

가장 쉬운 해결책은 새로운 stdoutstdout 오픈 /dev/null을 닫습니다 아마이다. 이것은 stdout에 사용 된 기본 파일 설명자를 닫아야합니다. 다음 파일 열기가 해당 설명자를 다시 사용한다는 것을 의미합니다.

+1

감사합니다. 정확히 어떻게하는지 설명하지는 않았지만 (미안하지만, 나는 초보자입니다.), 이것은 여전히 ​​올바른 답이었습니다. 내 실제 문제는 내가 정확히 (실현하지 않고)했던 소스 코드 예제를 시도했지만 ** stdout **을 선점 한 IDE에서 실행 중이기 때문에 실행되지 않았다는 것입니다. 나는 그 모범으로 돌아가서 (그리고 다른 사람들의 무리) 마침내 무슨 일이 일어나고 있는지 알아 냈다. 이 예는 [여기] (http://stackoverflow.com/questions/16582194/python-version-of-freopen), answer # 3입니다. –

0

응용 프로그램에서 "C"라이브러리 함수를 호출 할 수있는 경우 freopen()을 사용하여 프로세스의 표준 출력 및 표준 오류 스트림을 사용자 자신의 로그 파일 또는 /dev/null으로 리디렉션 할 수 있습니다.

나는이 작업을 수행하는 방법은 다음과 같습니다 표준 오류에 대한

FILE *stdout = fdopen(1, "w"); 
FILE *myout = freopen("out.log", "w", stdout); 

마찬가지로, 파일 기술자 매개 변수에 12 인스턴스를 사용하여 :

FILE *stderr = fdopen(2, "w"); 
FILE *myerr = freopen("err.log", "w", stdout); 

내가 정확히 LibVLC 내 자바 바인딩에 .

+0

고마워, C는 아직도 나를 넘어. 그러나 freopen()에 대한 정보를 검색하는 것은 어제 필자가 freopen()의 Python 버전을 작성한 소스 샘플로 되돌아 왔고, 아래의 @JoachimPileborg의 대답은 샘플이 수행하는 작업을 설명했습니다.내 IDE가 코드 실행을 방해하고 있다고 판단한 후에 [이 예제] (http://stackoverflow.com/questions/16582194/python-version-of-freopen)가 작동합니다. –

관련 문제