bpo-40094: Add _bootsubprocess._waitstatus_to_exitcode (GH-19264)

https://github.com/python/cpython/commit/40bfdb1594189f3c0238e5d2098dc3abf11... commit: 40bfdb1594189f3c0238e5d2098dc3abf114e200 branch: master author: Victor Stinner <vstinner@python.org> committer: GitHub <noreply@github.com> date: 2020-03-31T23:45:13+02:00 summary: 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. files: M Lib/_bootsubprocess.py diff --git a/Lib/_bootsubprocess.py b/Lib/_bootsubprocess.py index 962301ae1499e..9c1912f315dc9 100644 --- a/Lib/_bootsubprocess.py +++ b/Lib/_bootsubprocess.py @@ -6,6 +6,15 @@ 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 @@ def wait(self): 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:
participants (1)
-
Victor Stinner