From 0f21adf7999d0a50889cde65419e51cfe77e9e1d Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" Date: Sat, 29 Sep 2012 12:41:03 -0700 Subject: [PATCH] pty.spawn() now returns the child process status as returned by os.waitpid(). Addresses the remaining feature request from issue #2489. --- Doc/library/pty.rst | 3 +++ Lib/pty.py | 1 + Lib/test/test_pty.py | 6 ++++++ Misc/NEWS | 2 ++ 4 files changed, 12 insertions(+) diff --git a/Doc/library/pty.rst b/Doc/library/pty.rst index 2b9385b5f9e..90baec542fe 100644 --- a/Doc/library/pty.rst +++ b/Doc/library/pty.rst @@ -45,6 +45,9 @@ The :mod:`pty` module defines the following functions: a file descriptor. The defaults try to read 1024 bytes each time they are called. + .. versionchanged:: 3.4 + :func:`spawn` now returns the status value from :func:`os.waitpid` + on the child process. Example ------- diff --git a/Lib/pty.py b/Lib/pty.py index 3ccf619896c..3b79202199e 100644 --- a/Lib/pty.py +++ b/Lib/pty.py @@ -178,3 +178,4 @@ def spawn(argv, master_read=_read, stdin_read=_read): tty.tcsetattr(STDIN_FILENO, tty.TCSAFLUSH, mode) os.close(master_fd) + return os.waitpid(pid, 0)[1] diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py index ef95268e19e..db370391f78 100644 --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -196,6 +196,12 @@ class PtyTest(unittest.TestCase): # pty.fork() passed. + def test_spawn_returns_status(self): + status = pty.spawn([sys.executable, '-c', 'import sys; sys.exit(0)']) + self.assertEqual(status, 0) + status = pty.spawn([sys.executable, '-c', 'import sys; sys.exit(5)']) + self.assertEqual(status, 5 << 8) + class SmallPtyTests(unittest.TestCase): """These tests don't spawn children or hang.""" diff --git a/Misc/NEWS b/Misc/NEWS index 0012f1ea669..04751b710b1 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -15,6 +15,8 @@ Core and Builtins Library ------- +- pty.spawn() now returns the child process status returned by os.waitpid(). + - Issue #15756: subprocess.poll() now properly handles errno.ECHILD to return a returncode of 0 when the child has already exited or cannot be waited on.