summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2018-06-22 10:33:48 -0700
committerGitHub <noreply@github.com>2018-06-22 10:33:48 -0700
commit3747dd16d5d2af3499f586386e49740a0454cf44 (patch)
tree3d92645f482068ca93a9267b6195cf25c7fc2d14
parent1bb9dd337ed5aa9eafc8e2ce017ceedf044145e3 (diff)
downloadcpython-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.py9
-rw-r--r--Misc/NEWS.d/next/C API/2018-06-21-15-29-59.bpo-33932.VSlXyS.rst2
-rw-r--r--Programs/_testembed.c14
-rw-r--r--Python/pylifecycle.c5
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;