diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2017-12-02 09:11:32 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-02 09:11:32 (GMT) |
commit | af5a895073c24637c094772b27526b94a12ec897 (patch) | |
tree | 2960347bdeb6d0ba50746d5d36630d13630f1bb9 /Modules/main.c | |
parent | e23c06e2b03452c9aaf0dae52296c85e572f9bcd (diff) | |
download | cpython-af5a895073c24637c094772b27526b94a12ec897.zip cpython-af5a895073c24637c094772b27526b94a12ec897.tar.gz cpython-af5a895073c24637c094772b27526b94a12ec897.tar.bz2 |
bpo-32030: _PyPathConfig_Init() sets home and program_name (#4673)
_PyPathConfig_Init() now also initialize home and program_name:
* Rename existing _PyPathConfig_Init() to _PyPathConfig_Calculate().
Add a new _PyPathConfig_Init() function in pathconfig.c which
handles the _Py_path_config variable and call
_PyPathConfig_Calculate().
* Add home and program_name fields to _PyPathConfig.home
* _PyPathConfig_Init() now initialize home and program_name
from main_config
* Py_SetProgramName(), Py_SetPythonHome() and Py_GetPythonHome() now
calls Py_FatalError() on failure, instead of silently ignoring
failures.
* config_init_home() now gets directly _Py_path_config.home to only
get the value set by Py_SetPythonHome(), or NULL if
Py_SetPythonHome() was not called.
* config_get_program_name() now gets directly
_Py_path_config.program_name to only get the value set by
Py_SetProgramName(), or NULL if Py_SetProgramName() was not called.
* pymain_init_python() doesn't call Py_SetProgramName() anymore,
_PyPathConfig_Init() now always sets the program name
* Call _PyMainInterpreterConfig_Read() in
pymain_parse_cmdline_envvars_impl() to control the memory allocator
* C API documentation: it's no more safe to call Py_GetProgramName()
before Py_Initialize().
Diffstat (limited to 'Modules/main.c')
-rw-r--r-- | Modules/main.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/Modules/main.c b/Modules/main.c index 6c6c801..84706e1 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -876,6 +876,16 @@ static _PyInitError config_get_program_name(_PyMainInterpreterConfig *config) { assert(config->program_name == NULL); + + /* If Py_SetProgramName() was called, use its value */ + wchar_t *program_name = _Py_path_config.program_name; + if (program_name != NULL) { + config->program_name = _PyMem_RawWcsdup(program_name); + if (config->program_name == NULL) { + return _Py_INIT_NO_MEMORY(); + } + } + #ifdef __APPLE__ char *p; /* On MacOS X, when the Python interpreter is embedded in an @@ -914,6 +924,7 @@ config_get_program_name(_PyMainInterpreterConfig *config) } #endif /* WITH_NEXT_FRAMEWORK */ #endif /* __APPLE__ */ + return _Py_INIT_OK(); } @@ -948,13 +959,6 @@ pymain_init_main_interpreter(_PyMain *pymain) { _PyInitError err; - /* TODO: Print any exceptions raised by these operations */ - err = _PyMainInterpreterConfig_Read(&pymain->config); - if (_Py_INIT_FAILED(err)) { - pymain->err = err; - return -1; - } - err = _Py_InitializeMainInterpreter(&pymain->config); if (_Py_INIT_FAILED(err)) { pymain->err = err; @@ -1412,14 +1416,13 @@ config_init_pythonpath(_PyMainInterpreterConfig *config) static _PyInitError -config_init_pythonhome(_PyMainInterpreterConfig *config) +config_init_home(_PyMainInterpreterConfig *config) { wchar_t *home; - home = Py_GetPythonHome(); + /* If Py_SetPythonHome() was called, use its value */ + home = _Py_path_config.home; if (home) { - /* Py_SetPythonHome() has been called before Py_Main(), - use its value */ config->home = _PyMem_RawWcsdup(home); if (config->home == NULL) { return _Py_INIT_NO_MEMORY(); @@ -1439,7 +1442,7 @@ config_init_pythonhome(_PyMainInterpreterConfig *config) _PyInitError _PyMainInterpreterConfig_ReadEnv(_PyMainInterpreterConfig *config) { - _PyInitError err = config_init_pythonhome(config); + _PyInitError err = config_init_home(config); if (_Py_INIT_FAILED(err)) { return err; } @@ -1543,6 +1546,12 @@ pymain_parse_cmdline_envvars_impl(_PyMain *pymain) return -1; } + _PyInitError err = _PyMainInterpreterConfig_Read(&pymain->config); + if (_Py_INIT_FAILED(err)) { + pymain->err = err; + return -1; + } + return 0; } @@ -1566,11 +1575,6 @@ pymain_init_python(_PyMain *pymain) { pymain_init_stdio(pymain); - Py_SetProgramName(pymain->config.program_name); - /* Don't free program_name here: the argument to Py_SetProgramName - must remain valid until Py_FinalizeEx is called. The string is freed - by pymain_free(). */ - pymain->err = _Py_InitializeCore(&pymain->core_config); if (_Py_INIT_FAILED(pymain->err)) { return -1; |