"""
A command wrapper to get a live output displayed.
Useful when you need to write a plugin that outputs some progress or info.
"""
import subprocess
import sys
from io import BufferedReader
from click import echo, style
[docs]def launch_cmd_displays_output(cmd: list, print_msg: bool = True,
print_err: bool = True, err_to_out: bool = False):
"""Launch a command and displays conditionnaly messages and / or errors"""
try:
stderr = subprocess.PIPE if err_to_out is False else subprocess.STDOUT
result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=stderr)
except Exception as error:
raise SystemError('Cannot run the command: {}'.format(error))
_read_messages(result, print_msg)
if print_err is True and err_to_out is False:
_print_errors(result)
return result
[docs]def verbose(display: bool, message: str):
"""Display a message if verbose is On"""
if display is True:
echo(style('[VERBOSE]', fg='green') + ' {}'.format(message), file=sys.stderr)
def _read_messages(result: BufferedReader, display: bool = False):
"""Print messages sent to the STDOUT"""
for line in result.stdout:
line = line.decode()
line = line if display is True else '.'
print(line, end='')
sys.stdout.flush()
print()
def _print_errors(result: BufferedReader):
"""Print messages sent to the STDERR"""
num = 0
for line in result.stderr:
err = line.decode()
if num is 0:
print(style("Command returned errors :", fg='red'))
if num < 5:
print(err, end='')
elif num is 5:
print(style('... and more', fg='red'))
num += 1