For the ALSA errors in particular, you can use ALSA’s snd_lib_error_set_handler
function as described for example in this question.
For one of my projects, I created a module called mute_alsa
, which looks like this:
import ctypes
ERROR_HANDLER_FUNC = ctypes.CFUNCTYPE(None, ctypes.c_char_p, ctypes.c_int,
ctypes.c_char_p, ctypes.c_int,
ctypes.c_char_p)
def py_error_handler(filename, line, function, err, fmt):
pass
c_error_handler = ERROR_HANDLER_FUNC(py_error_handler)
try:
asound = ctypes.cdll.LoadLibrary('libasound.so.2')
asound.snd_lib_error_set_handler(c_error_handler)
except OSError:
pass
And you use it simply by putting the following into your code:
import mute_alsa
In a more general sense, you can prevent anything from printing to
stderr
by simply closing the associated file descriptor. For
example, if we try to rm
a file that doesn’t exist, we get an error
message printed to stderr
:
>>> import sys
>>> import os
>>> os.system('rm /doesnotexist')
rm: cannot remove ‘/doesnotexist’: Is a directory
256
If we close the stderr
file descriptor:
>>> os.close(sys.stderr.fileno())
We no longer see any error messages:
>>> os.system('rm /doesnotexist')
The downside to this approach is that it silences all messages to
stderr
, which means you will no longer see legitimate error
messages. This may lead to surprising failure modes (the program
exited without printing any errors!).