[Python-checkins] bpo-32030: Move PYTHONPATH to _PyMainInterpreterConfig (#4511)

Victor Stinner webhook-mailer at python.org
Wed Nov 22 19:49:47 EST 2017


https://github.com/python/cpython/commit/e32e79f7d8216b78ac9e61bb1f2eee693108d4ee
commit: e32e79f7d8216b78ac9e61bb1f2eee693108d4ee
branch: master
author: Victor Stinner <victor.stinner at gmail.com>
committer: GitHub <noreply at github.com>
date: 2017-11-23T01:49:45+01:00
summary:

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

Move _PyCoreConfig.module_search_path_env to _PyMainInterpreterConfig
structure.

files:
M Include/pylifecycle.h
M Include/pystate.h
M Modules/getpath.c
M Modules/main.c
M PC/getpathp.c
M Python/pylifecycle.c

diff --git a/Include/pylifecycle.h b/Include/pylifecycle.h
index 2a5e73a79ca..5eaa74edab8 100644
--- a/Include/pylifecycle.h
+++ b/Include/pylifecycle.h
@@ -94,7 +94,7 @@ PyAPI_FUNC(wchar_t *) Py_GetPrefix(void);
 PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void);
 PyAPI_FUNC(wchar_t *) Py_GetPath(void);
 #ifdef Py_BUILD_CORE
-PyAPI_FUNC(wchar_t *) _Py_GetPathWithConfig(_PyCoreConfig *config);
+PyAPI_FUNC(wchar_t *) _Py_GetPathWithConfig(_PyMainInterpreterConfig *config);
 #endif
 PyAPI_FUNC(void)      Py_SetPath(const wchar_t *);
 #ifdef MS_WINDOWS
diff --git a/Include/pystate.h b/Include/pystate.h
index c5d3c3345f0..b2739f1db25 100644
--- a/Include/pystate.h
+++ b/Include/pystate.h
@@ -30,7 +30,6 @@ typedef struct {
     unsigned long hash_seed;
     int _disable_importlib; /* Needed by freeze_importlib */
     const char *allocator;  /* Memory allocator: _PyMem_SetupAllocators() */
-    wchar_t *module_search_path_env; /* PYTHONPATH environment variable */
     int dev_mode;           /* -X dev */
     int faulthandler;       /* -X faulthandler */
     int tracemalloc;        /* -X tracemalloc=N */
@@ -46,7 +45,6 @@ typedef struct {
      .hash_seed = 0, \
      ._disable_importlib = 0, \
      .allocator = NULL, \
-     .module_search_path_env = NULL, \
      .dev_mode = 0, \
      .faulthandler = 0, \
      .tracemalloc = 0, \
@@ -62,11 +60,13 @@ typedef struct {
  */
 typedef struct {
     int install_signal_handlers;
+    wchar_t *module_search_path_env; /* PYTHONPATH environment variable */
 } _PyMainInterpreterConfig;
 
 #define _PyMainInterpreterConfig_INIT \
     (_PyMainInterpreterConfig){\
-     .install_signal_handlers = -1}
+     .install_signal_handlers = -1, \
+     .module_search_path_env = NULL}
 
 typedef struct _is {
 
diff --git a/Modules/getpath.c b/Modules/getpath.c
index ad4a4e5e718..ead143280b7 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -456,7 +456,7 @@ search_for_exec_prefix(wchar_t *argv0_path, wchar_t *home,
 }
 
 static void
-calculate_path(_PyCoreConfig *core_config)
+calculate_path(_PyMainInterpreterConfig *config)
 {
     extern wchar_t *Py_GetProgramName(void);
 
@@ -706,9 +706,9 @@ calculate_path(_PyCoreConfig *core_config)
     bufsz = 0;
 
     wchar_t *env_path = NULL;
-    if (core_config) {
-        if (core_config->module_search_path_env) {
-            bufsz += wcslen(core_config->module_search_path_env) + 1;
+    if (config) {
+        if (config->module_search_path_env) {
+            bufsz += wcslen(config->module_search_path_env) + 1;
         }
     }
     else {
@@ -752,9 +752,9 @@ calculate_path(_PyCoreConfig *core_config)
 
     /* Run-time value of $PYTHONPATH goes first */
     buf[0] = '\0';
-    if (core_config) {
-        if (core_config->module_search_path_env) {
-            wcscpy(buf, core_config->module_search_path_env);
+    if (config) {
+        if (config->module_search_path_env) {
+            wcscpy(buf, config->module_search_path_env);
             wcscat(buf, delimiter);
         }
     }
@@ -858,10 +858,10 @@ Py_SetPath(const wchar_t *path)
 }
 
 wchar_t *
-_Py_GetPathWithConfig(_PyCoreConfig *core_config)
+_Py_GetPathWithConfig(_PyMainInterpreterConfig *config)
 {
     if (!module_search_path) {
-        calculate_path(core_config);
+        calculate_path(config);
     }
     return module_search_path;
 }
diff --git a/Modules/main.c b/Modules/main.c
index 3bd93e37601..8390af29238 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -389,6 +389,7 @@ typedef struct {
     /* non-zero is stdin is a TTY or if -i option is used */
     int stdin_is_interactive;
     _PyCoreConfig core_config;
+    _PyMainInterpreterConfig config;
     _Py_CommandLineDetails cmdline;
     PyObject *main_importer_path;
     /* non-zero if filename, command (-c) or module (-m) is set
@@ -409,6 +410,7 @@ typedef struct {
     {.status = 0, \
      .cf = {.cf_flags = 0}, \
      .core_config = _PyCoreConfig_INIT, \
+     .config = _PyMainInterpreterConfig_INIT, \
      .main_importer_path = NULL, \
      .run_code = -1, \
      .program_name = NULL, \
@@ -442,7 +444,7 @@ pymain_free_impl(_PyMain *pymain)
     Py_CLEAR(pymain->main_importer_path);
     PyMem_RawFree(pymain->program_name);
 
-    PyMem_RawFree(pymain->core_config.module_search_path_env);
+    PyMem_RawFree(pymain->config.module_search_path_env);
 
 #ifdef __INSURE__
     /* Insure++ is a memory analysis tool that aids in discovering
@@ -957,20 +959,16 @@ pymain_get_program_name(_PyMain *pymain)
 static int
 pymain_init_main_interpreter(_PyMain *pymain)
 {
-    _PyMainInterpreterConfig config = _PyMainInterpreterConfig_INIT;
     _PyInitError err;
 
-    /* TODO: Moar config options! */
-    config.install_signal_handlers = 1;
-
     /* TODO: Print any exceptions raised by these operations */
-    err = _Py_ReadMainInterpreterConfig(&config);
+    err = _Py_ReadMainInterpreterConfig(&pymain->config);
     if (_Py_INIT_FAILED(err)) {
         pymain->err = err;
         return -1;
     }
 
-    err = _Py_InitializeMainInterpreter(&config);
+    err = _Py_InitializeMainInterpreter(&pymain->config);
     if (_Py_INIT_FAILED(err)) {
         pymain->err = err;
         return -1;
@@ -1387,7 +1385,7 @@ pymain_init_pythonpath(_PyMain *pymain)
         return -1;
     }
 
-    pymain->core_config.module_search_path_env = path2;
+    pymain->config.module_search_path_env = path2;
 #else
     char *path = pymain_get_env_var("PYTHONPATH");
     if (!path) {
@@ -1405,7 +1403,7 @@ pymain_init_pythonpath(_PyMain *pymain)
         }
         return -1;
     }
-    pymain->core_config.module_search_path_env = wpath;
+    pymain->config.module_search_path_env = wpath;
 #endif
     return 0;
 }
@@ -1574,6 +1572,8 @@ pymain_init(_PyMain *pymain)
     }
 
     pymain->core_config._disable_importlib = 0;
+    /* TODO: Moar config options! */
+    pymain->config.install_signal_handlers = 1;
 
     orig_argc = pymain->argc;           /* For Py_GetArgcArgv() */
     orig_argv = pymain->argv;
diff --git a/PC/getpathp.c b/PC/getpathp.c
index b182ae6a58d..1d18faed450 100644
--- a/PC/getpathp.c
+++ b/PC/getpathp.c
@@ -624,7 +624,7 @@ read_pth_file(const wchar_t *path, wchar_t *prefix, int *isolated, int *nosite)
 
 
 static void
-calculate_path(_PyCoreConfig *core_config)
+calculate_path(_PyMainInterpreterConfig *config)
 {
     wchar_t argv0_path[MAXPATHLEN+1];
     wchar_t *buf;
@@ -637,8 +637,8 @@ calculate_path(_PyCoreConfig *core_config)
     wchar_t *userpath = NULL;
     wchar_t zip_path[MAXPATHLEN+1];
 
-    if (core_config) {
-        envpath = core_config->module_search_path_env;
+    if (config) {
+        envpath = config->module_search_path_env;
     }
     else if (!Py_IgnoreEnvironmentFlag) {
         envpath = _wgetenv(L"PYTHONPATH");
@@ -899,10 +899,10 @@ Py_SetPath(const wchar_t *path)
 }
 
 wchar_t *
-_Py_GetPathWithConfig(_PyCoreConfig *core_config)
+_Py_GetPathWithConfig(_PyMainInterpreterConfig *config)
 {
     if (!module_search_path) {
-        calculate_path(core_config);
+        calculate_path(config);
     }
     return module_search_path;
 }
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 9eeac9d33be..552501d23ca 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -843,7 +843,7 @@ _Py_InitializeMainInterpreter(const _PyMainInterpreterConfig *config)
     /* GetPath may initialize state that _PySys_EndInit locks
        in, and so has to be called first. */
     /* 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) {
         /* 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 */
 
-    wchar_t *sys_path = _Py_GetPathWithConfig(&interp->core_config);
+    wchar_t *sys_path = _Py_GetPathWithConfig(&interp->config);
 
     PyObject *modules = PyDict_New();
     if (modules == NULL) {



More information about the Python-checkins mailing list