From fb47bca9ee2d07ce96df94b4e4abafd11826eb01 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 20 Jul 2018 17:34:23 +0200 Subject: 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. --- Python/pylifecycle.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'Python') 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 * -- cgit v1.2.1