bpo-34008: Allow to call Py_Main() after Py_Initialize() (GH-8043) (GH-8352)

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.
(cherry picked from commit fb47bca9ee)

Co-authored-by: Victor Stinner <vstinner@redhat.com>
This commit is contained in:
Miss Islington (bot) 2018-07-20 17:16:22 -07:00 committed by Victor Stinner
parent 49abd307d2
commit 03ec4df67d
5 changed files with 52 additions and 6 deletions

View file

@ -775,6 +775,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
@ -796,9 +812,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();
@ -813,6 +826,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
*