diff options
| author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2018-06-22 10:33:48 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-06-22 10:33:48 -0700 |
| commit | 3747dd16d5d2af3499f586386e49740a0454cf44 (patch) | |
| tree | 3d92645f482068ca93a9267b6195cf25c7fc2d14 | |
| parent | 1bb9dd337ed5aa9eafc8e2ce017ceedf044145e3 (diff) | |
| download | cpython-git-3747dd16d5d2af3499f586386e49740a0454cf44.tar.gz | |
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 <vstinner@redhat.com>
| -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 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; |
