diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py index be13c079bb8..0b2e0b45b23 100644 --- a/Lib/multiprocessing/process.py +++ b/Lib/multiprocessing/process.py @@ -317,12 +317,12 @@ class BaseProcess(object): finally: util._exit_function() except SystemExit as e: - if not e.args: - exitcode = 1 - elif isinstance(e.args[0], int): - exitcode = e.args[0] + if e.code is None: + exitcode = 0 + elif isinstance(e.code, int): + exitcode = e.code else: - sys.stderr.write(str(e.args[0]) + '\n') + sys.stderr.write(str(e.code) + '\n') exitcode = 1 except: exitcode = 1 diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py index 4e48cd45e14..73dc75d34a6 100644 --- a/Lib/test/_test_multiprocessing.py +++ b/Lib/test/_test_multiprocessing.py @@ -864,12 +864,21 @@ class _TestSubclassingProcess(BaseTestCase): os.unlink(testfn) - for reason in (True, False, 8): - p = self.Process(target=sys.exit, args=(reason,)) - p.daemon = True - p.start() - join_process(p) - self.assertEqual(p.exitcode, reason) + cases = [ + ((True,), 1), + ((False,), 0), + ((8,), 8), + ((None,), 0), + ((), 0), + ] + + for args, expected in cases: + with self.subTest(args=args): + p = self.Process(target=sys.exit, args=args) + p.daemon = True + p.start() + join_process(p) + self.assertEqual(p.exitcode, expected) # # diff --git a/Misc/ACKS b/Misc/ACKS index 976c26eb911..f329a2d4a7d 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -746,6 +746,7 @@ Lawrence Hudson Michael Hudson Jim Hugunin Greg Humphreys +Chris Hunt Eric Huss Nehal Hussain Taihyun Hwang diff --git a/Misc/NEWS.d/next/Library/2019-01-12-20-39-34.bpo-35727.FWrbHn.rst b/Misc/NEWS.d/next/Library/2019-01-12-20-39-34.bpo-35727.FWrbHn.rst new file mode 100644 index 00000000000..9f3fa40e51b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-01-12-20-39-34.bpo-35727.FWrbHn.rst @@ -0,0 +1 @@ +Fix sys.exit() and sys.exit(None) exit code propagation when used in multiprocessing.Process. \ No newline at end of file