summaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2018-07-20 17:34:23 +0200
committerGitHub <noreply@github.com>2018-07-20 17:34:23 +0200
commitfb47bca9ee2d07ce96df94b4e4abafd11826eb01 (patch)
tree5adbd1b262e05b0cd62bed74254b29f42c8b05c7 /Python
parent2c5c0a367c6ca648178072240fe0a32848636da6 (diff)
downloadcpython-git-fb47bca9ee2d07ce96df94b4e4abafd11826eb01.tar.gz
bpo-34008: Allow to call Py_Main() after Py_Initialize() (GH-8043)
Py_Main() can again be called after Py_Initialize(), as in Python 3.6. The new configuration is ignored, except of _PyMainInterpreterConfig.argv which is used to update sys.argv.
Diffstat (limited to 'Python')
-rw-r--r--Python/pylifecycle.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 9bf0ebd35d..64fa1e58f7 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -772,6 +772,22 @@ _Py_InitializeCore(const _PyCoreConfig *core_config)
return _Py_INIT_OK();
}
+/* Py_Initialize() has already been called: update the main interpreter
+ configuration. Example of bpo-34008: Py_Main() called after
+ Py_Initialize(). */
+static _PyInitError
+_Py_ReconfigureMainInterpreter(PyInterpreterState *interp,
+ const _PyMainInterpreterConfig *config)
+{
+ if (config->argv != NULL) {
+ int res = PyDict_SetItemString(interp->sysdict, "argv", config->argv);
+ if (res < 0) {
+ return _Py_INIT_ERR("fail to set sys.argv");
+ }
+ }
+ return _Py_INIT_OK();
+}
+
/* Update interpreter state based on supplied configuration settings
*
* After calling this function, most of the restrictions on the interpreter
@@ -793,9 +809,6 @@ _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig *config)
if (!_PyRuntime.core_initialized) {
return _Py_INIT_ERR("runtime core not initialized");
}
- if (_PyRuntime.initialized) {
- return _Py_INIT_ERR("main interpreter already initialized");
- }
/* Get current thread state and interpreter pointer */
tstate = PyThreadState_GET();
@@ -810,6 +823,10 @@ _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig *config)
return _Py_INIT_ERR("failed to copy main interpreter config");
}
+ if (_PyRuntime.initialized) {
+ return _Py_ReconfigureMainInterpreter(interp, config);
+ }
+
if (interp->core_config._disable_importlib) {
/* Special mode for freeze_importlib: run with no import system
*