Browse Source

bpo-38724: Implement subprocess.Popen.__repr__ (GH-17151)

pull/17239/head
Andrey Doroschenko 6 years ago
committed by Tal Einat
parent
commit
645005e947
  1. 9
      Lib/subprocess.py
  2. 24
      Lib/test/test_subprocess.py
  3. 1
      Misc/NEWS.d/next/Library/2019-11-14-14-13-29.bpo-38724.T5ySfR.rst

9
Lib/subprocess.py

@ -978,6 +978,15 @@ class Popen(object):
raise
def __repr__(self):
obj_repr = (
f"<{self.__class__.__name__}: "
f"returncode: {self.returncode} args: {list(self.args)!r}>"
)
if len(obj_repr) > 80:
obj_repr = obj_repr[:76] + "...>"
return obj_repr
@property
def universal_newlines(self):
# universal_newlines as retained as an alias of text_mode for API

24
Lib/test/test_subprocess.py

@ -1360,6 +1360,30 @@ class ProcessTestCase(BaseTestCase):
self.addCleanup(p.stdin.close)
p.communicate(b"x" * 2**20)
def test_repr(self):
# Run a command that waits for user input, to check the repr() of
# a Proc object while and after the sub-process runs.
code = 'import sys; input(); sys.exit(57)'
cmd = [sys.executable, '-c', code]
result = "<Popen: returncode: {}"
with subprocess.Popen(
cmd, stdin=subprocess.PIPE, universal_newlines=True) as proc:
self.assertIsNone(proc.returncode)
self.assertTrue(
repr(proc).startswith(result.format(proc.returncode)) and
repr(proc).endswith('>')
)
proc.communicate(input='exit...\n')
proc.wait()
self.assertIsNotNone(proc.returncode)
self.assertTrue(
repr(proc).startswith(result.format(proc.returncode)) and
repr(proc).endswith('>')
)
def test_communicate_epipe_only_stdin(self):
# Issue 10963: communicate() should hide EPIPE
p = subprocess.Popen(ZERO_RETURN_CMD,

1
Misc/NEWS.d/next/Library/2019-11-14-14-13-29.bpo-38724.T5ySfR.rst

@ -0,0 +1 @@
Add a repr for ``subprocess.Popen`` objects. Patch by Andrey Doroschenko.
Loading…
Cancel
Save