From 0e2f5c4021dafa637dbc734e4a03b4d0de44a770 Mon Sep 17 00:00:00 2001 From: idziubenko Date: Tue, 21 Dec 2021 15:32:26 +0300 Subject: [PATCH] added binary mode for process.read() --- pym/calculate/lib/utils/files.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/pym/calculate/lib/utils/files.py b/pym/calculate/lib/utils/files.py index a423f8d..20bda89 100644 --- a/pym/calculate/lib/utils/files.py +++ b/pym/calculate/lib/utils/files.py @@ -226,7 +226,7 @@ class process(StdoutableProcess): self.cacheerr = b"" return self.cacheerr.decode("UTF-8") - def readByLine(self): + def readByLine(self, binary=False): _cacheerr = [] try: self._open() @@ -244,7 +244,7 @@ class process(StdoutableProcess): for fd in ret[0]: if fd == _stdout: s = self.pipe.stdout.readline() - yield s.decode("UTF-8") + yield s if binary else s.decode("UTF-8") self._cachedata.append(s) if fd == _stderr: s = self.pipe.stderr.readline() @@ -255,13 +255,13 @@ class process(StdoutableProcess): s = self.pipe.stdout.readline() if not s: break - yield s.decode("UTF-8") + yield s if binary else s.decode("UTF-8") self._cachedata.append(s) while True: s = self.pipe.stderr.readline() if not s: break - yield s.decode("UTF-8") + yield s if binary else s.decode("UTF-8") _cacheerr.append(s) break except KeyboardInterrupt: @@ -273,7 +273,7 @@ class process(StdoutableProcess): self.cacheerr = b''.join(_cacheerr) self.close() - def read(self): + def read(self, binary=False): """Read all data""" try: self._open() @@ -281,12 +281,15 @@ class process(StdoutableProcess): if self.timeout is None: self.cacheresult, self.cacheerr = self.pipe.communicate() else: - for line in self.readByLine(): + for line in self.readByLine(binary=True): pass - try: - return self.cacheresult.decode(encoding="UTF-8") - except UnicodeDecodeError as e: - return self.cacheresult.decode(encoding="UTF-16") + if binary == True: + return self.cacheresult + else: + try: + return self.cacheresult.decode(encoding="UTF-8") + except UnicodeDecodeError as e: + return self.cacheresult.decode(encoding="UTF-16") except KeyboardInterrupt: self.kill() raise KeyboardInterrupt