mirror of https://github.com/python/cpython
bpo-32030: Move PYTHONPATH to _PyMainInterpreterConfig (#4511)
Move _PyCoreConfig.module_search_path_env to _PyMainInterpreterConfig structure.
This commit is contained in:
parent
0784a2e5b1
commit
e32e79f7d8
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue