I like sh for brevity of its API. I often have to use `_tty_out=False`, but this is easy to fix once and for all commands in a script:
my_sh = sh.bake(_tty_out=False)
my_sh.do_whatever()
The way how sh captures output can apparently be altered, say, by providing a callable to _out argument.