mirror of https://github.com/python/cpython
Issue #13854: Properly handle non-integer, non-string arg to SystemExit
Previously multiprocessing only expected int or str. It also wrongly used an exit code of 1 when the argument was a string instead of zero.
This commit is contained in:
parent
d44a4a27a6
commit
2182e0578c
|
@ -262,12 +262,12 @@ class Process(object):
|
||||||
except SystemExit, e:
|
except SystemExit, e:
|
||||||
if not e.args:
|
if not e.args:
|
||||||
exitcode = 1
|
exitcode = 1
|
||||||
elif type(e.args[0]) is int:
|
elif isinstance(e.args[0], int):
|
||||||
exitcode = e.args[0]
|
exitcode = e.args[0]
|
||||||
else:
|
else:
|
||||||
sys.stderr.write(e.args[0] + '\n')
|
sys.stderr.write(str(e.args[0]) + '\n')
|
||||||
sys.stderr.flush()
|
sys.stderr.flush()
|
||||||
exitcode = 1
|
exitcode = 0 if isinstance(e.args[0], str) else 1
|
||||||
except:
|
except:
|
||||||
exitcode = 1
|
exitcode = 1
|
||||||
import traceback
|
import traceback
|
||||||
|
|
|
@ -325,6 +325,36 @@ class _TestProcess(BaseTestCase):
|
||||||
]
|
]
|
||||||
self.assertEqual(result, expected)
|
self.assertEqual(result, expected)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def _test_sys_exit(cls, reason, testfn):
|
||||||
|
sys.stderr = open(testfn, 'w')
|
||||||
|
sys.exit(reason)
|
||||||
|
|
||||||
|
def test_sys_exit(self):
|
||||||
|
# See Issue 13854
|
||||||
|
if self.TYPE == 'threads':
|
||||||
|
return
|
||||||
|
|
||||||
|
testfn = test_support.TESTFN
|
||||||
|
self.addCleanup(test_support.unlink, testfn)
|
||||||
|
|
||||||
|
for reason, code in (([1, 2, 3], 1), ('ignore this', 0)):
|
||||||
|
p = self.Process(target=self._test_sys_exit, args=(reason, testfn))
|
||||||
|
p.daemon = True
|
||||||
|
p.start()
|
||||||
|
p.join(5)
|
||||||
|
self.assertEqual(p.exitcode, code)
|
||||||
|
|
||||||
|
with open(testfn, 'r') as f:
|
||||||
|
self.assertEqual(f.read().rstrip(), str(reason))
|
||||||
|
|
||||||
|
for reason in (True, False, 8):
|
||||||
|
p = self.Process(target=sys.exit, args=(reason,))
|
||||||
|
p.daemon = True
|
||||||
|
p.start()
|
||||||
|
p.join(5)
|
||||||
|
self.assertEqual(p.exitcode, reason)
|
||||||
|
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
|
|
@ -67,6 +67,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #13854: Make multiprocessing properly handle non-integer
|
||||||
|
non-string argument to SystemExit.
|
||||||
|
|
||||||
- Issue #12157: Make pool.map() empty iterables correctly. Initial
|
- Issue #12157: Make pool.map() empty iterables correctly. Initial
|
||||||
patch by mouad.
|
patch by mouad.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue