diff options
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/getpath.c | 6 | ||||
-rw-r--r-- | Modules/main.c | 81 |
2 files changed, 70 insertions, 17 deletions
diff --git a/Modules/getpath.c b/Modules/getpath.c index ead1432..62f5e69 100644 --- a/Modules/getpath.c +++ b/Modules/getpath.c @@ -456,13 +456,13 @@ search_for_exec_prefix(wchar_t *argv0_path, wchar_t *home, } static void -calculate_path(_PyMainInterpreterConfig *config) +calculate_path(const _PyMainInterpreterConfig *config) { extern wchar_t *Py_GetProgramName(void); static const wchar_t delimiter[2] = {DELIM, '\0'}; static const wchar_t separator[2] = {SEP, '\0'}; - wchar_t *home = Py_GetPythonHome(); + wchar_t *home = _Py_GetPythonHomeWithConfig(config); char *_path = getenv("PATH"); wchar_t *path_buffer = NULL; wchar_t *path = NULL; @@ -858,7 +858,7 @@ Py_SetPath(const wchar_t *path) } wchar_t * -_Py_GetPathWithConfig(_PyMainInterpreterConfig *config) +_Py_GetPathWithConfig(const _PyMainInterpreterConfig *config) { if (!module_search_path) { calculate_path(config); diff --git a/Modules/main.c b/Modules/main.c index 8390af2..07e0d2a 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -400,7 +400,6 @@ typedef struct { _PyInitError err; /* PYTHONWARNINGS env var */ _Py_OptList env_warning_options; - /* PYTHONPATH env var */ int argc; wchar_t **argv; } _PyMain; @@ -1368,48 +1367,99 @@ pymain_set_flags_from_env(_PyMain *pymain) static int -pymain_init_pythonpath(_PyMain *pymain) +pymain_get_env_var_dup(_PyMain *pymain, wchar_t **dest, + wchar_t *wname, char *name) { if (Py_IgnoreEnvironmentFlag) { + *dest = NULL; return 0; } #ifdef MS_WINDOWS - wchar_t *path = _wgetenv(L"PYTHONPATH"); - if (!path || path[0] == '\0') { + wchar_t *var = _wgetenv(wname); + if (!var || var[0] == '\0') { + *dest = NULL; return 0; } - wchar_t *path2 = pymain_wstrdup(pymain, path); - if (path2 == NULL) { + wchar_t *copy = pymain_wstrdup(pymain, var); + if (copy == NULL) { return -1; } - pymain->config.module_search_path_env = path2; + *dest = copy; #else - char *path = pymain_get_env_var("PYTHONPATH"); - if (!path) { + char *var = getenv(name); + if (!var || var[0] == '\0') { + *dest = NULL; return 0; } size_t len; - wchar_t *wpath = Py_DecodeLocale(path, &len); - if (!wpath) { + wchar_t *wvar = Py_DecodeLocale(var, &len); + if (!wvar) { if (len == (size_t)-2) { - pymain->err = _Py_INIT_ERR("failed to decode PYTHONHOME"); + /* don't set pymain->err */ + return -2; } else { pymain->err = INIT_NO_MEMORY(); + return -1; } - return -1; } - pymain->config.module_search_path_env = wpath; + *dest = wvar; #endif return 0; } static int +pymain_init_pythonpath(_PyMain *pymain) +{ + wchar_t *path; + int res = pymain_get_env_var_dup(pymain, &path, + L"PYTHONPATH", "PYTHONPATH"); + if (res < 0) { + if (res == -2) { + pymain->err = _Py_INIT_ERR("failed to decode PYTHONPATH"); + } + return -1; + } + pymain->config.module_search_path_env = path; + return 0; +} + + +static int +pymain_init_pythonhome(_PyMain *pymain) +{ + wchar_t *home; + + home = Py_GetPythonHome(); + if (home) { + /* Py_SetPythonHome() has been called before Py_Main(), + use its value */ + pymain->config.pythonhome = pymain_wstrdup(pymain, home); + if (pymain->config.pythonhome == NULL) { + return -1; + } + return 0; + } + + int res = pymain_get_env_var_dup(pymain, &home, + L"PYTHONHOME", "PYTHONHOME"); + if (res < 0) { + if (res == -2) { + pymain->err = _Py_INIT_ERR("failed to decode PYTHONHOME"); + } + return -1; + } + pymain->config.pythonhome = home; + return 0; +} + + +static int pymain_parse_envvars(_PyMain *pymain) { _PyCoreConfig *core_config = &pymain->core_config; @@ -1433,6 +1483,9 @@ pymain_parse_envvars(_PyMain *pymain) if (pymain_init_pythonpath(pymain) < 0) { return -1; } + if (pymain_init_pythonhome(pymain) < 0) { + return -1; + } /* -X options */ if (pymain_get_xoption(pymain, L"showrefcount")) { |