]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38724: Implement subprocess.Popen.__repr__ (GH-17151)
authorAndrey Doroschenko <dorosch.github.io@yandex.ru>
Sun, 17 Nov 2019 14:08:31 +0000 (17:08 +0300)
committerTal Einat <taleinat+github@gmail.com>
Sun, 17 Nov 2019 14:08:31 +0000 (16:08 +0200)
Lib/subprocess.py
Lib/test/test_subprocess.py
Misc/NEWS.d/next/Library/2019-11-14-14-13-29.bpo-38724.T5ySfR.rst [new file with mode: 0644]

index b5a45d9fea23c5ab3683ecf4759ded2ee9899625..ba6f1983a5a2273f7ad654b710b27a6ed1557ec1 100644 (file)
@@ -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
index 9e96a6d9a87474fe5b8343fcedb10ae0e7d25830..97dc09c564965ae9409d9990c4e5861131034470 100644 (file)
@@ -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,
diff --git a/Misc/NEWS.d/next/Library/2019-11-14-14-13-29.bpo-38724.T5ySfR.rst b/Misc/NEWS.d/next/Library/2019-11-14-14-13-29.bpo-38724.T5ySfR.rst
new file mode 100644 (file)
index 0000000..a5ebfb3
--- /dev/null
@@ -0,0 +1 @@
+Add a repr for ``subprocess.Popen`` objects. Patch by Andrey Doroschenko.
\ No newline at end of file