subprocess: support universal_newlines

https://github.com/eventlet/eventlet/issues/243
This commit is contained in:
Sergey Shepelev
2015-09-13 13:11:32 +03:00
committed by Thomas Goirand
parent d44594ab3c
commit 96849ef941
2 changed files with 22 additions and 2 deletions

View File

@@ -55,8 +55,19 @@ class Popen(subprocess_orig.Popen):
# eventlet.processes.Process.run() method.
for attr in "stdin", "stdout", "stderr":
pipe = getattr(self, attr)
if pipe is not None and not type(pipe) == greenio.GreenPipe:
wrapped_pipe = greenio.GreenPipe(pipe, pipe.mode, bufsize)
if pipe is not None and type(pipe) != greenio.GreenPipe:
# https://github.com/eventlet/eventlet/issues/243
# AttributeError: '_io.TextIOWrapper' object has no attribute 'mode'
mode = getattr(pipe, 'mode', '')
if not mode:
if pipe.readable():
mode += 'r'
if pipe.writable():
mode += 'w'
# ValueError: can't have unbuffered text I/O
if bufsize == 0:
bufsize = -1
wrapped_pipe = greenio.GreenPipe(pipe, mode, bufsize)
setattr(self, attr, wrapped_pipe)
__init__.__doc__ = subprocess_orig.Popen.__init__.__doc__

View File

@@ -64,3 +64,12 @@ def test_close_popen_stdin_with_close_fds():
p.stdin.close()
except Exception as e:
assert False, "Exception should not be raised, got %r instead" % e
def test_universal_lines():
p = subprocess.Popen(
[sys.executable, '--version'],
shell=False,
stdout=subprocess.PIPE,
universal_newlines=True)
p.communicate(None)