bpo-38724: Implement subprocess.Popen.__repr__ (GH-17151)
This commit is contained in:
parent
143a97f641
commit
645005e947
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Add a repr for ``subprocess.Popen`` objects. Patch by Andrey Doroschenko.
|
Loading…
Reference in New Issue