diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2017-11-23 10:43:14 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-23 10:43:14 +0100 |
commit | 1f15111a6e15d52f6b08907576ec61493cd59358 (patch) | |
tree | b1a8fd55a1790e3dfd2026cc238e7344f293af90 /Modules | |
parent | e32e79f7d8216b78ac9e61bb1f2eee693108d4ee (diff) | |
download | cpython-git-1f15111a6e15d52f6b08907576ec61493cd59358.tar.gz |
bpo-32030: Add _PyMainInterpreterConfig.pythonhome (#4513)
* Py_Main() now reads the PYTHONHOME environment variable
* Add _Py_GetPythonHomeWithConfig() private function
* Add _PyWarnings_InitWithConfig()
* init_filters() doesn't get the current core configuration from the
current interpreter or Python thread anymore. Pass explicitly the
configuration to _PyWarnings_InitWithConfig().
* _Py_InitializeCore() now fails on _PyWarnings_InitWithConfig()
failure.
* Pass configuration as constant
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 ead143280b..62f5e69584 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 8390af2923..07e0d2aa85 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")) { |