diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index c52cb994878..f3b60433ccc 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 00000000000..90ca3ece091 --- /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 7406470ae65..b8827f074b9 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 958219b7445..9bf0ebd35d0 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -892,6 +892,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;