Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion Include/internal/pystate.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,17 @@ typedef struct _PyPathConfig {
wchar_t *program_name;
/* Set by Py_SetPythonHome() or PYTHONHOME environment variable */
wchar_t *home;
/* isolated and no_site_import are used to set Py_IsolatedFlag and
Py_NoSiteFlag flags on Windows in read_pth_file(). These fields
are ignored when their value are equal to -1 (unset). */
int isolated;
int no_site_import;
} _PyPathConfig;

#define _PyPathConfig_INIT {.module_search_path = NULL}
#define _PyPathConfig_INIT \
{.module_search_path = NULL, \
.isolated = -1, \
.no_site_import = -1}
/* Note: _PyPathConfig_INIT sets other fields to 0/NULL */

PyAPI_DATA(_PyPathConfig) _Py_path_config;
Expand Down
10 changes: 8 additions & 2 deletions Include/pylifecycle.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,12 +54,18 @@ PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding,
PyAPI_FUNC(_PyInitError) _Py_InitializeCore(const _PyCoreConfig *);
PyAPI_FUNC(int) _Py_IsCoreInitialized(void);

PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *);
PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(
_PyCoreConfig *config,
int *isolated,
int *no_site_import);
PyAPI_FUNC(void) _PyCoreConfig_Clear(_PyCoreConfig *);
PyAPI_FUNC(int) _PyCoreConfig_Copy(
_PyCoreConfig *config,
const _PyCoreConfig *config2);
PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitPathConfig(_PyCoreConfig *config);
PyAPI_FUNC(_PyInitError) _PyCoreConfig_InitPathConfig(
_PyCoreConfig *config,
int *isolated,
int *no_site_import);
PyAPI_FUNC(_PyInitError) _PyCoreConfig_SetPathConfig(
const _PyCoreConfig *config);

Expand Down
20 changes: 5 additions & 15 deletions Modules/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1953,19 +1953,9 @@ pymain_read_conf_impl(_PyMain *pymain, _Py_CommandLineDetails *cmdline)
return -1;
}

/* On Windows, _PyPathConfig_Init() modifies Py_IsolatedFlag and
Py_NoSiteFlag variables if a "._pth" file is found. */
int init_isolated = Py_IsolatedFlag;
int init_no_site = Py_NoSiteFlag;
Py_IsolatedFlag = cmdline->isolated;
Py_NoSiteFlag = cmdline->no_site_import;

err = _PyCoreConfig_Read(config);

cmdline->isolated = Py_IsolatedFlag;
cmdline->no_site_import = Py_NoSiteFlag;
Py_IsolatedFlag = init_isolated;
Py_NoSiteFlag = init_no_site;
err = _PyCoreConfig_Read(config,
&cmdline->isolated,
&cmdline->no_site_import);

if (_Py_INIT_FAILED(err)) {
pymain->err = err;
Expand Down Expand Up @@ -2116,7 +2106,7 @@ config_init_locale(_PyCoreConfig *config)
*/

_PyInitError
_PyCoreConfig_Read(_PyCoreConfig *config)
_PyCoreConfig_Read(_PyCoreConfig *config, int *isolated, int *no_site_import)
{
_PyInitError err;

Expand Down Expand Up @@ -2161,7 +2151,7 @@ _PyCoreConfig_Read(_PyCoreConfig *config)
}

if (!config->_disable_importlib) {
err = _PyCoreConfig_InitPathConfig(config);
err = _PyCoreConfig_InitPathConfig(config, isolated, no_site_import);
if (_Py_INIT_FAILED(err)) {
return err;
}
Expand Down
18 changes: 7 additions & 11 deletions PC/getpathp.c
Original file line number Diff line number Diff line change
Expand Up @@ -553,8 +553,7 @@ get_program_full_path(const _PyCoreConfig *core_config,


static int
read_pth_file(_PyPathConfig *config, wchar_t *prefix, const wchar_t *path,
int *isolated, int *nosite)
read_pth_file(_PyPathConfig *config, wchar_t *prefix, const wchar_t *path)
{
FILE *sp_file = _Py_wfopen(path, L"r");
if (sp_file == NULL) {
Expand All @@ -563,8 +562,8 @@ read_pth_file(_PyPathConfig *config, wchar_t *prefix, const wchar_t *path,

wcscpy_s(prefix, MAXPATHLEN+1, path);
reduce(prefix);
*isolated = 1;
*nosite = 1;
config->isolated = 1;
config->no_site_import = 1;

size_t bufsiz = MAXPATHLEN;
size_t prefixlen = wcslen(prefix);
Expand All @@ -589,9 +588,10 @@ read_pth_file(_PyPathConfig *config, wchar_t *prefix, const wchar_t *path,
}

if (strcmp(line, "import site") == 0) {
*nosite = 0;
config->no_site_import = 0;
continue;
} else if (strncmp(line, "import ", 7) == 0) {
}
else if (strncmp(line, "import ", 7) == 0) {
Py_FatalError("only 'import site' is supported in ._pth file");
}

Expand Down Expand Up @@ -680,11 +680,7 @@ calculate_pth_file(_PyPathConfig *config, wchar_t *prefix)
return 0;
}

/* FIXME, bpo-32030: Global configuration variables should not be modified
here, _PyPathConfig_Init() is called early in Python initialization:
see pymain_cmdline(). */
return read_pth_file(config, prefix, spbuffer,
&Py_IsolatedFlag, &Py_NoSiteFlag);
return read_pth_file(config, prefix, spbuffer);
}


Expand Down
25 changes: 14 additions & 11 deletions Python/pathconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,8 @@ core_config_init_module_search_paths(_PyCoreConfig *config,


_PyInitError
_PyCoreConfig_InitPathConfig(_PyCoreConfig *config)
_PyCoreConfig_InitPathConfig(_PyCoreConfig *config,
int *isolated, int *no_site_import)
{
_PyPathConfig path_config = _PyPathConfig_INIT;
_PyInitError err;
Expand Down Expand Up @@ -344,6 +345,13 @@ _PyCoreConfig_InitPathConfig(_PyCoreConfig *config)
}
}

if (path_config.isolated != -1 && isolated != NULL) {
*isolated = path_config.isolated;
}
if (path_config.no_site_import != -1 && no_site_import != NULL) {
*no_site_import = path_config.no_site_import;
}

_PyPathConfig_Clear(&path_config);
return _Py_INIT_OK();

Expand All @@ -365,30 +373,25 @@ pathconfig_global_init(void)
}

_PyInitError err;
_PyPathConfig path_config = _PyPathConfig_INIT;
_PyCoreConfig config = _PyCoreConfig_INIT;

err = _PyCoreConfig_Read(&config);
/* Py_IsolatedFlag and Py_NoSiteFlag are left unchanged: pass NULL.
_PyCoreConfig_InitPathConfig() will be called later and will set
these flags. */
err = _PyCoreConfig_Read(&config, NULL, NULL);
if (_Py_INIT_FAILED(err)) {
goto error;
}

err = _PyPathConfig_Calculate(&path_config, &config);
err = _PyCoreConfig_SetPathConfig(&config);
if (_Py_INIT_FAILED(err)) {
goto error;
}

err = _PyPathConfig_SetGlobal(&path_config);
if (_Py_INIT_FAILED(err)) {
goto error;
}

_PyPathConfig_Clear(&path_config);
_PyCoreConfig_Clear(&config);
return;

error:
_PyPathConfig_Clear(&path_config);
_PyCoreConfig_Clear(&config);
_Py_FatalInitError(err);
}
Expand Down
2 changes: 1 addition & 1 deletion Python/pylifecycle.c
Original file line number Diff line number Diff line change
Expand Up @@ -928,7 +928,7 @@ _Py_InitializeEx_Private(int install_sigs, int install_importlib)
config._disable_importlib = !install_importlib;
config.install_signal_handlers = install_sigs;

err = _PyCoreConfig_Read(&config);
err = _PyCoreConfig_Read(&config, &Py_IsolatedFlag, &Py_NoSiteFlag);
if (_Py_INIT_FAILED(err)) {
goto done;
}
Expand Down