From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Fri, 22 Jun 2018 17:33:48 +0000 (-0700) Subject: bpo-33932: Calling Py_Initialize() twice does nothing (GH-7845) X-Git-Tag: v3.7.1rc1~388 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3747dd16d5d2af3499f586386e49740a0454cf44;p=python bpo-33932: Calling Py_Initialize() twice does nothing (GH-7845) Calling Py_Initialize() twice does nothing, instead of failing with a fatal error: restore the Python 3.6 behaviour. (cherry picked from commit 209abf746985526bce255e2fba97d3246924885d) Co-authored-by: Victor Stinner --- diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index c52cb99487..f3b60433cc 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -229,6 +229,15 @@ class EmbeddingTests(unittest.TestCase): self.assertEqual(out, '') self.assertEqual(err, '') + def test_initialize_twice(self): + """ + bpo-33932: Calling Py_Initialize() twice should do nothing (and not + crash!). + """ + out, err = self.run_embedded_interpreter("initialize_twice") + self.assertEqual(out, '') + self.assertEqual(err, '') + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/C API/2018-06-21-15-29-59.bpo-33932.VSlXyS.rst b/Misc/NEWS.d/next/C API/2018-06-21-15-29-59.bpo-33932.VSlXyS.rst new file mode 100644 index 0000000000..90ca3ece09 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2018-06-21-15-29-59.bpo-33932.VSlXyS.rst @@ -0,0 +1,2 @@ +Calling Py_Initialize() twice does nothing, instead of failing with a fatal +error: restore the Python 3.6 behaviour. diff --git a/Programs/_testembed.c b/Programs/_testembed.c index 7406470ae6..b8827f074b 100644 --- a/Programs/_testembed.c +++ b/Programs/_testembed.c @@ -263,6 +263,19 @@ static int test_bpo20891(void) return 0; } +static int test_initialize_twice(void) +{ + _testembed_Py_Initialize(); + + /* bpo-33932: Calling Py_Initialize() twice should do nothing + * (and not crash!). */ + Py_Initialize(); + + Py_Finalize(); + + return 0; +} + /* ********************************************************* * List of test cases and the function that implements it. @@ -288,6 +301,7 @@ static struct TestCase TestCases[] = { { "pre_initialization_api", test_pre_initialization_api }, { "pre_initialization_sys_options", test_pre_initialization_sys_options }, { "bpo20891", test_bpo20891 }, + { "initialize_twice", test_initialize_twice }, { NULL, NULL } }; diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 2ef96f8d99..fdb759f480 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -895,6 +895,11 @@ _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig *config) _PyInitError _Py_InitializeEx_Private(int install_sigs, int install_importlib) { + if (_PyRuntime.initialized) { + /* bpo-33932: Calling Py_Initialize() twice does nothing. */ + return _Py_INIT_OK(); + } + _PyCoreConfig config = _PyCoreConfig_INIT; _PyInitError err;