From 40bfdb1594189f3c0238e5d2098dc3abf114e200 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 31 Mar 2020 23:45:13 +0200 Subject: bpo-40094: Add _bootsubprocess._waitstatus_to_exitcode (GH-19264) * Add _waitstatus_to_exitcode() helper function to _bootsubprocess. * Enhance check_output() error message if the command fails. _bootsubprocess no longer handles WIFSTOPPED() case: it now raises a ValueError. --- Lib/_bootsubprocess.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/Lib/_bootsubprocess.py b/Lib/_bootsubprocess.py index 962301a..9c1912f 100644 --- a/Lib/_bootsubprocess.py +++ b/Lib/_bootsubprocess.py @@ -6,6 +6,15 @@ subprocess is unavailable. setup.py is not used on Windows. import os +def _waitstatus_to_exitcode(status): + if os.WIFEXITED(status): + return os.WEXITSTATUS(status) + elif os.WIFSIGNALED(status): + return -os.WTERMSIG(status) + else: + raise ValueError(f"invalid wait status: {status!r}") + + # distutils.spawn used by distutils.command.build_ext # calls subprocess.Popen().wait() class Popen: @@ -27,15 +36,8 @@ class Popen: os._exit(1) else: # Parent process - pid, status = os.waitpid(pid, 0) - if os.WIFSIGNALED(status): - self.returncode = -os.WTERMSIG(status) - elif os.WIFEXITED(status): - self.returncode = os.WEXITSTATUS(status) - elif os.WIFSTOPPED(status): - self.returncode = -os.WSTOPSIG(status) - else: - raise Exception(f"unknown child process exit status: {status!r}") + _, status = os.waitpid(pid, 0) + self.returncode = _waitstatus_to_exitcode(status) return self.returncode @@ -85,8 +87,10 @@ def check_output(cmd, **kwargs): try: # system() spawns a shell status = os.system(cmd) - if status: - raise ValueError(f"Command {cmd!r} failed with status {status!r}") + exitcode = _waitstatus_to_exitcode(status) + if exitcode: + raise ValueError(f"Command {cmd!r} returned non-zero " + f"exit status {exitcode!r}") try: with open(tmp_filename, "rb") as fp: -- cgit v0.12