mirror of
https://github.com/python/cpython.git
synced 2025-08-28 20:56:54 +00:00
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.
This commit is contained in:
parent
2c5c0a367c
commit
fb47bca9ee
5 changed files with 52 additions and 6 deletions
|
@ -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
|
||||
*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue