From 7ae6240de2824f962e34fda3cd4c88cdb413c071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Tue, 15 Nov 2016 17:26:11 +0100 Subject: [PATCH] Make CommandLineCaller use unicode instead of bytes p.(stdout|stderr).text is unicode. p.(stdout|stderr).readline isn't, so decode manually. Should hopefully solve #1586 for good now... --- src/octoprint/util/commandline.py | 43 ++++++++++++++----------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/octoprint/util/commandline.py b/src/octoprint/util/commandline.py index 41e6abf7..47b8f424 100644 --- a/src/octoprint/util/commandline.py +++ b/src/octoprint/util/commandline.py @@ -10,6 +10,8 @@ import sarge import logging import re +from . import to_unicode + # These regexes are based on the colorama package # Author: Jonathan Hartley @@ -82,36 +84,31 @@ class CommandlineCaller(object): all_stdout = [] all_stderr = [] + + def process_lines(lines, logger): + if not lines: + return [] + l = self._preprocess_lines(*map(lambda x: to_unicode(x, errors="replace"), lines)) + logger(*l) + return list(l) + + def process_stdout(lines): + return process_lines(lines, self._log_stdout) + + def process_stderr(lines): + return process_lines(lines, self._log_stderr) + try: while p.returncode is None: - lines = p.stderr.readlines(timeout=0.5) - if lines: - lines = self._preprocess_lines(*lines) - self._log_stderr(*lines) - all_stderr += list(lines) - - lines = p.stdout.readlines(timeout=0.5) - if lines: - lines = self._preprocess_lines(*lines) - self._log_stdout(*lines) - all_stdout += list(lines) - + all_stderr += process_stderr(p.stderr.readlines(timeout=0.5)) + all_stdout += process_stdout(p.stdout.readlines(timeout=0.5)) p.commands[0].poll() finally: p.close() - lines = p.stderr.readlines() - if lines: - lines = self._preprocess_lines(*lines) - self._log_stderr(*lines) - all_stderr += lines - - lines = p.stdout.readlines() - if lines: - lines = self._preprocess_lines(*lines) - self._log_stdout(*lines) - all_stdout += lines + all_stderr += process_stderr(p.stderr.readlines()) + all_stdout += process_stdout(p.stdout.readlines()) return p.returncode, all_stdout, all_stderr