bpo-32030: Move PYTHONPATH to _PyMainInterpreterConfig (#4511)

Move _PyCoreConfig.module_search_path_env to _PyMainInterpreterConfig
structure.
This commit is contained in:
Victor Stinner 2017-11-23 01:49:45 +01:00 committed by GitHub
parent 0784a2e5b1
commit e32e79f7d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 29 additions and 29 deletions

View File

@ -94,7 +94,7 @@ PyAPI_FUNC(wchar_t *) Py_GetPrefix(void);
PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void); PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void);
PyAPI_FUNC(wchar_t *) Py_GetPath(void); PyAPI_FUNC(wchar_t *) Py_GetPath(void);
#ifdef Py_BUILD_CORE #ifdef Py_BUILD_CORE
PyAPI_FUNC(wchar_t *) _Py_GetPathWithConfig(_PyCoreConfig *config); PyAPI_FUNC(wchar_t *) _Py_GetPathWithConfig(_PyMainInterpreterConfig *config);
#endif #endif
PyAPI_FUNC(void) Py_SetPath(const wchar_t *); PyAPI_FUNC(void) Py_SetPath(const wchar_t *);
#ifdef MS_WINDOWS #ifdef MS_WINDOWS

View File

@ -30,7 +30,6 @@ typedef struct {
unsigned long hash_seed; unsigned long hash_seed;
int _disable_importlib; /* Needed by freeze_importlib */ int _disable_importlib; /* Needed by freeze_importlib */
const char *allocator; /* Memory allocator: _PyMem_SetupAllocators() */ const char *allocator; /* Memory allocator: _PyMem_SetupAllocators() */
wchar_t *module_search_path_env; /* PYTHONPATH environment variable */
int dev_mode; /* -X dev */ int dev_mode; /* -X dev */
int faulthandler; /* -X faulthandler */ int faulthandler; /* -X faulthandler */
int tracemalloc; /* -X tracemalloc=N */ int tracemalloc; /* -X tracemalloc=N */
@ -46,7 +45,6 @@ typedef struct {
.hash_seed = 0, \ .hash_seed = 0, \
._disable_importlib = 0, \ ._disable_importlib = 0, \
.allocator = NULL, \ .allocator = NULL, \
.module_search_path_env = NULL, \
.dev_mode = 0, \ .dev_mode = 0, \
.faulthandler = 0, \ .faulthandler = 0, \
.tracemalloc = 0, \ .tracemalloc = 0, \
@ -62,11 +60,13 @@ typedef struct {
*/ */
typedef struct { typedef struct {
int install_signal_handlers; int install_signal_handlers;
wchar_t *module_search_path_env; /* PYTHONPATH environment variable */
} _PyMainInterpreterConfig; } _PyMainInterpreterConfig;
#define _PyMainInterpreterConfig_INIT \ #define _PyMainInterpreterConfig_INIT \
(_PyMainInterpreterConfig){\ (_PyMainInterpreterConfig){\
.install_signal_handlers = -1} .install_signal_handlers = -1, \
.module_search_path_env = NULL}
typedef struct _is { typedef struct _is {

View File

@ -456,7 +456,7 @@ search_for_exec_prefix(wchar_t *argv0_path, wchar_t *home,
} }
static void static void
calculate_path(_PyCoreConfig *core_config) calculate_path(_PyMainInterpreterConfig *config)
{ {
extern wchar_t *Py_GetProgramName(void); extern wchar_t *Py_GetProgramName(void);
@ -706,9 +706,9 @@ calculate_path(_PyCoreConfig *core_config)
bufsz = 0; bufsz = 0;
wchar_t *env_path = NULL; wchar_t *env_path = NULL;
if (core_config) { if (config) {
if (core_config->module_search_path_env) { if (config->module_search_path_env) {
bufsz += wcslen(core_config->module_search_path_env) + 1; bufsz += wcslen(config->module_search_path_env) + 1;
} }
} }
else { else {
@ -752,9 +752,9 @@ calculate_path(_PyCoreConfig *core_config)
/* Run-time value of $PYTHONPATH goes first */ /* Run-time value of $PYTHONPATH goes first */
buf[0] = '\0'; buf[0] = '\0';
if (core_config) { if (config) {
if (core_config->module_search_path_env) { if (config->module_search_path_env) {
wcscpy(buf, core_config->module_search_path_env); wcscpy(buf, config->module_search_path_env);
wcscat(buf, delimiter); wcscat(buf, delimiter);
} }
} }
@ -858,10 +858,10 @@ Py_SetPath(const wchar_t *path)
} }
wchar_t * wchar_t *
_Py_GetPathWithConfig(_PyCoreConfig *core_config) _Py_GetPathWithConfig(_PyMainInterpreterConfig *config)
{ {
if (!module_search_path) { if (!module_search_path) {
calculate_path(core_config); calculate_path(config);
} }
return module_search_path; return module_search_path;
} }

View File

@ -389,6 +389,7 @@ typedef struct {
/* non-zero is stdin is a TTY or if -i option is used */ /* non-zero is stdin is a TTY or if -i option is used */
int stdin_is_interactive; int stdin_is_interactive;
_PyCoreConfig core_config; _PyCoreConfig core_config;
_PyMainInterpreterConfig config;
_Py_CommandLineDetails cmdline; _Py_CommandLineDetails cmdline;
PyObject *main_importer_path; PyObject *main_importer_path;
/* non-zero if filename, command (-c) or module (-m) is set /* non-zero if filename, command (-c) or module (-m) is set
@ -409,6 +410,7 @@ typedef struct {
{.status = 0, \ {.status = 0, \
.cf = {.cf_flags = 0}, \ .cf = {.cf_flags = 0}, \
.core_config = _PyCoreConfig_INIT, \ .core_config = _PyCoreConfig_INIT, \
.config = _PyMainInterpreterConfig_INIT, \
.main_importer_path = NULL, \ .main_importer_path = NULL, \
.run_code = -1, \ .run_code = -1, \
.program_name = NULL, \ .program_name = NULL, \
@ -442,7 +444,7 @@ pymain_free_impl(_PyMain *pymain)
Py_CLEAR(pymain->main_importer_path); Py_CLEAR(pymain->main_importer_path);
PyMem_RawFree(pymain->program_name); PyMem_RawFree(pymain->program_name);
PyMem_RawFree(pymain->core_config.module_search_path_env); PyMem_RawFree(pymain->config.module_search_path_env);
#ifdef __INSURE__ #ifdef __INSURE__
/* Insure++ is a memory analysis tool that aids in discovering /* Insure++ is a memory analysis tool that aids in discovering
@ -957,20 +959,16 @@ pymain_get_program_name(_PyMain *pymain)
static int static int
pymain_init_main_interpreter(_PyMain *pymain) pymain_init_main_interpreter(_PyMain *pymain)
{ {
_PyMainInterpreterConfig config = _PyMainInterpreterConfig_INIT;
_PyInitError err; _PyInitError err;
/* TODO: Moar config options! */
config.install_signal_handlers = 1;
/* TODO: Print any exceptions raised by these operations */ /* TODO: Print any exceptions raised by these operations */
err = _Py_ReadMainInterpreterConfig(&config); err = _Py_ReadMainInterpreterConfig(&pymain->config);
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {
pymain->err = err; pymain->err = err;
return -1; return -1;
} }
err = _Py_InitializeMainInterpreter(&config); err = _Py_InitializeMainInterpreter(&pymain->config);
if (_Py_INIT_FAILED(err)) { if (_Py_INIT_FAILED(err)) {
pymain->err = err; pymain->err = err;
return -1; return -1;
@ -1387,7 +1385,7 @@ pymain_init_pythonpath(_PyMain *pymain)
return -1; return -1;
} }
pymain->core_config.module_search_path_env = path2; pymain->config.module_search_path_env = path2;
#else #else
char *path = pymain_get_env_var("PYTHONPATH"); char *path = pymain_get_env_var("PYTHONPATH");
if (!path) { if (!path) {
@ -1405,7 +1403,7 @@ pymain_init_pythonpath(_PyMain *pymain)
} }
return -1; return -1;
} }
pymain->core_config.module_search_path_env = wpath; pymain->config.module_search_path_env = wpath;
#endif #endif
return 0; return 0;
} }
@ -1574,6 +1572,8 @@ pymain_init(_PyMain *pymain)
} }
pymain->core_config._disable_importlib = 0; pymain->core_config._disable_importlib = 0;
/* TODO: Moar config options! */
pymain->config.install_signal_handlers = 1;
orig_argc = pymain->argc; /* For Py_GetArgcArgv() */ orig_argc = pymain->argc; /* For Py_GetArgcArgv() */
orig_argv = pymain->argv; orig_argv = pymain->argv;

View File

@ -624,7 +624,7 @@ error:
static void static void
calculate_path(_PyCoreConfig *core_config) calculate_path(_PyMainInterpreterConfig *config)
{ {
wchar_t argv0_path[MAXPATHLEN+1]; wchar_t argv0_path[MAXPATHLEN+1];
wchar_t *buf; wchar_t *buf;
@ -637,8 +637,8 @@ calculate_path(_PyCoreConfig *core_config)
wchar_t *userpath = NULL; wchar_t *userpath = NULL;
wchar_t zip_path[MAXPATHLEN+1]; wchar_t zip_path[MAXPATHLEN+1];
if (core_config) { if (config) {
envpath = core_config->module_search_path_env; envpath = config->module_search_path_env;
} }
else if (!Py_IgnoreEnvironmentFlag) { else if (!Py_IgnoreEnvironmentFlag) {
envpath = _wgetenv(L"PYTHONPATH"); envpath = _wgetenv(L"PYTHONPATH");
@ -899,10 +899,10 @@ Py_SetPath(const wchar_t *path)
} }
wchar_t * wchar_t *
_Py_GetPathWithConfig(_PyCoreConfig *core_config) _Py_GetPathWithConfig(_PyMainInterpreterConfig *config)
{ {
if (!module_search_path) { if (!module_search_path) {
calculate_path(core_config); calculate_path(config);
} }
return module_search_path; return module_search_path;
} }

View File

@ -843,7 +843,7 @@ _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig *config)
/* GetPath may initialize state that _PySys_EndInit locks /* GetPath may initialize state that _PySys_EndInit locks
in, and so has to be called first. */ in, and so has to be called first. */
/* TODO: Call Py_GetPath() in Py_ReadConfig, rather than here */ /* TODO: Call Py_GetPath() in Py_ReadConfig, rather than here */
wchar_t *sys_path = _Py_GetPathWithConfig(&interp->core_config); wchar_t *sys_path = _Py_GetPathWithConfig(&interp->config);
if (interp->core_config._disable_importlib) { if (interp->core_config._disable_importlib) {
/* Special mode for freeze_importlib: run with no import system /* Special mode for freeze_importlib: run with no import system
@ -1301,7 +1301,7 @@ new_interpreter(PyThreadState **tstate_p)
/* XXX The following is lax in error checking */ /* XXX The following is lax in error checking */
wchar_t *sys_path = _Py_GetPathWithConfig(&interp->core_config); wchar_t *sys_path = _Py_GetPathWithConfig(&interp->config);
PyObject *modules = PyDict_New(); PyObject *modules = PyDict_New();
if (modules == NULL) { if (modules == NULL) {