Search code examples
pythonsubprocessespeak

How to hide output of subprocess


I'm using eSpeak on Ubuntu and have a Python 2.7 script that prints and speaks a message:

import subprocess
text = 'Hello World.'
print text
subprocess.call(['espeak', text])

eSpeak produces the desired sounds, but clutters the shell with some errors (ALSA lib..., no socket connect) so i cannot easily read what was printed earlier. Exit code is 0.

Unfortunately there is no documented option to turn off its verbosity, so I'm looking for a way to only visually silence it and keep the open shell clean for further interaction.

How can I do this?


See Python os.system without the output for approaches specific to os.system - although modern code should normally use the subprocess library instead.


Solution

  • For python >= 3.3, Redirect the output to DEVNULL:

    import os
    import subprocess
    
    retcode = subprocess.call(['echo', 'foo'], 
        stdout=subprocess.DEVNULL,
        stderr=subprocess.STDOUT)
    

    For python <3.3, including 2.7 use:

    FNULL = open(os.devnull, 'w')
    retcode = subprocess.call(['echo', 'foo'], 
        stdout=FNULL, 
        stderr=subprocess.STDOUT)
    

    It is effectively the same as running this shell command:

    retcode = os.system("echo 'foo' &> /dev/null")