diff options
author | Victor Stinner <vstinner@redhat.com> | 2018-06-22 17:14:51 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-22 17:14:51 (GMT) |
commit | 209abf746985526bce255e2fba97d3246924885d (patch) | |
tree | 4eaedaa7a870d61c2805df599e21fb9c883ddaeb | |
parent | bcd3a1a18d841338f57c39f6a7de8cf14d0c3e03 (diff) | |
download | cpython-209abf746985526bce255e2fba97d3246924885d.zip cpython-209abf746985526bce255e2fba97d3246924885d.tar.gz cpython-209abf746985526bce255e2fba97d3246924885d.tar.bz2 |
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.
-rw-r--r-- | Lib/test/test_embed.py | 9 | ||||
-rw-r--r-- | Misc/NEWS.d/next/C API/2018-06-21-15-29-59.bpo-33932.VSlXyS.rst | 2 | ||||
-rw-r--r-- | Programs/_testembed.c | 14 | ||||
-rw-r--r-- | Python/pylifecycle.c | 5 |
4 files changed, 30 insertions, 0 deletions
diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index c52cb99..f3b6043 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 0000000..90ca3ec --- /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 7406470..b8827f0 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 958219b..9bf0ebd 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; |