bpo-42260: Compute the path config in the main init (GH-23211)

The path configuration is now computed in the "main" initialization.
The core initialization no longer computes it.

* Add _PyConfig_Read() function to read the configuration without
  computing the path configuration.
* pyinit_core() no longer computes the path configuration: it is now
  computed by init_interp_main().
* The path configuration output members of PyConfig are now optional:

  * executable
  * base_executable
  * prefix
  * base_prefix
  * exec_prefix
  * base_exec_prefix

* _PySys_UpdateConfig() now skips NULL strings in PyConfig.
* _testembed: Rename test_set_config() to test_init_set_config() for
  consistency with other tests.
This commit is contained in:
Victor Stinner 2020-11-10 13:21:52 +01:00 committed by GitHub
parent 38811d68ca
commit 9e1b828265
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 85 additions and 74 deletions

View file

@ -2922,17 +2922,22 @@ _PySys_UpdateConfig(PyThreadState *tstate)
#define SET_SYS_FROM_WSTR(KEY, VALUE) \
SET_SYS(KEY, PyUnicode_FromWideChar(VALUE, -1));
#define COPY_WSTR(SYS_ATTR, WSTR) \
if (WSTR != NULL) { \
SET_SYS_FROM_WSTR(SYS_ATTR, WSTR); \
}
if (config->module_search_paths_set) {
COPY_LIST("path", config->module_search_paths);
}
SET_SYS_FROM_WSTR("executable", config->executable);
SET_SYS_FROM_WSTR("_base_executable", config->base_executable);
SET_SYS_FROM_WSTR("prefix", config->prefix);
SET_SYS_FROM_WSTR("base_prefix", config->base_prefix);
SET_SYS_FROM_WSTR("exec_prefix", config->exec_prefix);
SET_SYS_FROM_WSTR("base_exec_prefix", config->base_exec_prefix);
SET_SYS_FROM_WSTR("platlibdir", config->platlibdir);
COPY_WSTR("executable", config->executable);
COPY_WSTR("_base_executable", config->base_executable);
COPY_WSTR("prefix", config->prefix);
COPY_WSTR("base_prefix", config->base_prefix);
COPY_WSTR("exec_prefix", config->exec_prefix);
COPY_WSTR("base_exec_prefix", config->base_exec_prefix);
COPY_WSTR("platlibdir", config->platlibdir);
if (config->pycache_prefix != NULL) {
SET_SYS_FROM_WSTR("pycache_prefix", config->pycache_prefix);
@ -2946,8 +2951,9 @@ _PySys_UpdateConfig(PyThreadState *tstate)
SET_SYS("_xoptions", sys_create_xoptions_dict(config));
#undef COPY_LIST
#undef SET_SYS_FROM_WSTR
#undef COPY_LIST
#undef COPY_WSTR
// sys.flags
PyObject *flags = _PySys_GetObject(tstate, "flags"); // borrowed ref