in muss/utils/helpers.py [0:0]
def run_command(cmd, mute=False):
def readline_with_timeout(input_stream, timeout=0.1):
"""Avoids handing indefinitely when calling readline()
https://stackoverflow.com/questions/10756383/timeout-on-subprocess-readline-in-python"""
poll_obj = select.poll()
poll_obj.register(input_stream, select.POLLIN)
start = time.time()
while (time.time() - start) < timeout:
poll_result = poll_obj.poll(0)
if poll_result:
return input_stream.readline()
return ''
def get_available_output(input_stream):
output = ''
while True:
line = readline_with_timeout(input_stream, timeout=0.1)
if line == '':
break
output += line
return output
def read_and_print(input_stream, output_stream):
output = get_available_output(input_stream)
if not mute:
print(output, file=output_stream, end='', flush=True)
return output
# Inspired from subprocess.run() source
# HACK: shell=True is not secure
with Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True, encoding='utf-8') as process:
try:
stdout = ''
stderr = ''
while True:
stdout += read_and_print(process.stdout, sys.stdout)
stderr += read_and_print(process.stderr, sys.stderr)
if process.poll() is not None:
break
# Read remaining output in case there is some
stdout += read_and_print(process.stdout, sys.stdout)
stderr += read_and_print(process.stderr, sys.stderr)
except Exception:
if mute: # Print errors that could have been muted
print(stderr, file=sys.stderr)
print(get_available_output(process.stderr), file=sys.stderr)
process.kill()
process.wait()
raise
retcode = process.poll()
if retcode:
print(stderr, file=sys.stderr)
raise CalledProcessError(retcode, process.args, output=stdout, stderr=stderr)
return stdout.strip()