pyaudio 를 쓰면서 좀 짜증아 났던 부분이 강제적인 디버그 메시지를 봐야 한다는 것입니다.
구현한 프로그램이 시스템의 서비스로 등록되면 해당 메시지가 syslog 를 당당하게 차지하기도 합니다.
보통은 /usr/share/alsa/alsa.conf 파일이나 ~/.asoundrc 파일이나 /etc/asound.conf 설정이 문제가 있어서 발생하는 메시지라고 합니다.
가장 좋은 것은 최적화된 설정을 찾아서 고치는 것이겠죠..
고치지 않아도 동작 잘 되고, 위의 alsa 설정 고치기도 머리 아프고, 지저분한 것이 싫은 경우에는 에러 핸들러를 비워주면 해당 메시지 없이 사용할 수 있습니다.
#!/usr/bin/env python
from ctypes import *
import pyaudio
# c 언어에서 호출을 알아먹을 수 있도록 둘러쌓는(wrapping) 코드
ERROR_HANDLER_FUNC = CFUNCTYPE(None, c_char_p, c_int, c_char_p, c_int, c_char_p)
# 빈 에러 핸들러
def py_error_handler(filename, line, function, err, fmt):
pass
# c 라이브러리에 에러 핸들러 등록
# 반드시 pyaudio 호출 전에 호출
c_error_handler = ERROR_HANDLER_FUNC(py_error_handler)
asound = cdll.LoadLibrary('libasound.so')
asound.snd_lib_error_set_handler(c_error_handler)
# pyaudio 를 사용하는 실제 구현 부분
p = pyaudio.PyAudio()
# ......
p.terminate()
# 프로그램 종료시 기본 핸들러로 돌아가게끔 현재 핸들러 등록 해제
asound.snd_lib_error_set_handler(None)
위 내용은 stackoverflow 의 한 답변에서 찾은 내용인데 핵심은
- 빈 에러 핸들러(py_error_handler) 를 만들고
- C 라이브러리(libasound.so) 가 인식할 수 있게 둘러쌓은 다음(ERROR_HANDLER_FUNC(py_error_handler))
- 이 함수를 C 라이브러리의 새 핸들러로 등록하는 것입니다.(asound.snd_lib_error_set_handler(c_error_handler))
- 혹시 모르니 프로그램 끝날 때 이 빈 핸들러를 등록해제 해주면 좋겠죠(asound.snd_lib_error_set_handler(None))
전 이방법을 적용해서 디버그 메시지를 꺼버렸습니다!!
'IT > python' 카테고리의 다른 글
[python3] 셸 명령 파싱하기 성능 비교 (0) | 2024.01.05 |
---|---|
[fastapi] main.py 가 아닌 test.py 실행하기 (2) | 2023.12.12 |
[python3] 터미널에서 한 줄로 if else 사용하기 (2) | 2023.10.06 |
[python3] asyncssh + nohup command (0) | 2023.09.22 |
[python3] AttributeError: module 'lib' has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK' (0) | 2023.09.19 |