added binary mode for process.read()

master 3.7.2.11
idziubenko 2 years ago
parent 83a0747736
commit 0e2f5c4021

@ -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

Loading…
Cancel
Save