Description
Bug report
3.11.0b1 appears to have a regression in the behavior of Py_InitializeFromConfig()
in the way that sys.path
is computed.
Reproduction case 1:
This code attempts to set the path through the config.pythonpath_env
variable.
int main(int argc, char *argv[]) {
PyConfig config;
PyConfig_InitIsolatedConfig(&config);
PyConfig_SetString(&config, &config.pythonpath_env, L"/path/to/app:/other/path");
Py_InitializeFromConfig(&config);
PyRun_SimpleString("import sys; print(f'{sys.path=}')");
return 0
}
In Python 3.8.13, 3.9.12 and 3.10.4, this code shows 6 items when sys.path is printed:
/path/to/app
/other/path
/path/to/Python/lib/python3X.zip
/path/to/Python/lib/python3.X
/path/to/Python/lib/python3.X/lib-dynload
/path/to/Python/lib/python3.X/site-packages
In Python 3.11.0b1, the first two items are not present.
Reproduction case 2:
This example is a closer match to the "more complete example" in the docs; it reads a full configuration, then appending the extra search paths.
int main(int argc, char *argv[]) {
PyConfig config;
PyConfig_InitIsolatedConfig(&config);
PyConfig_Read(&config);
PyWideStringList_Append(&config.module_search_paths, L"/path/to/app");
PyWideStringList_Append(&config.module_search_paths, L"/other/path");
Py_InitializeFromConfig(&config);
PyRun_SimpleString("import sys; print(f'{sys.path=}')");
return 0
}
Again, in Python 3.8.13, 3.9.12 and 3.10.4, this code shows 6 items when sys.path is printed (although the order is different):
/path/to/Python/lib/python3X.zip
/path/to/Python/lib/python3.X
/path/to/Python/lib/python3.X/lib-dynload
/path/to/app
/other/path
/path/to/Python/lib/python3.X/site-packages
In Python 3.11.0b1, this raises an error, dumping the path configuration with _Py_DumpPathConfig()
. This appears to be because it's modifying the path enough to make the encodings
module unimportable.
If the 2 path appends are omitted (but the PyConfig_Read()
call is retained), it runs, and outputs sys.path - but with the 2 custom module search paths missing.
Analysis
As best as I can make out, the regression was introduced by 99fcf15 (cc @zooba) as part of a refactor of getpath()
.
Your environment
Observed in Python 3.11.0b1 on macOS 12.3.1 on M1 hardware; however, I don't think there's anything Mac specific about it.
FWIW, I discovered this while porting the support library used by Briefcase to publish macOS and iOS apps.