Skip to content

Commit b3a7758

Browse files
authored
[3.14][3.15] gh-151253: Dump the Python path configuration on _PyCodec_InitRegistry() failure (#151250) (#151269) (#151283)
[3.15] gh-151253: Dump the Python path configuration on _PyCodec_InitRegistry() failure (#151250) (#151269) gh-151253: Dump the Python path configuration on _PyCodec_InitRegistry() failure (#151250) If "import encodings" fails at Python startup, dump the Python path configuration to help users debugging their configuration. The encodings module is the first module imported during Python startup. (cherry picked from commit 7b6e989) (cherry picked from commit 10f616c)
1 parent 7befb46 commit b3a7758

3 files changed

Lines changed: 17 additions & 0 deletions

File tree

Lib/test/test_cmd_line.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,6 +1262,17 @@ def test_invalid_thread_local_bytecode(self):
12621262
rc, out, err = assert_python_failure(PYTHON_TLBC="2")
12631263
self.assertIn(b"PYTHON_TLBC=N: N is missing or invalid", err)
12641264

1265+
def test_dump_path_config(self):
1266+
# gh-151253: At the first import (import encodings) during Python
1267+
# startup, if the import fails, dump the Python path configuration.
1268+
nonexistent = '/nonexistent-python-path'
1269+
# Use -X frozen_modules=off to disable frozen encodings module
1270+
# on release build.
1271+
cmd = ["-X", "frozen_modules=off", "-c", "pass"]
1272+
proc = assert_python_failure(*cmd, PYTHONHOME=nonexistent)
1273+
self.assertIn(b'Python path configuration:', proc.err)
1274+
self.assertIn(f"PYTHONHOME = '{nonexistent}'".encode(), proc.err)
1275+
12651276

12661277
@unittest.skipIf(interpreter_requires_environment(),
12671278
'Cannot run -I tests when PYTHON env vars are required.')
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
If ``import encodings`` (first import) fails at Python startup, dump the
2+
Python path configuration to help users debugging their configuration. Patch
3+
by Victor Stinner.

Python/codecs.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Copyright (c) Corporation for National Research Initiatives.
1010

1111
#include "Python.h"
1212
#include "pycore_call.h" // _PyObject_CallNoArgs()
13+
#include "pycore_initconfig.h" // _Py_DumpPathConfig()
1314
#include "pycore_interp.h" // PyInterpreterState.codec_search_path
1415
#include "pycore_pyerrors.h" // _PyErr_FormatNote()
1516
#include "pycore_pystate.h" // _PyInterpreterState_GET()
@@ -1691,6 +1692,8 @@ _PyCodec_InitRegistry(PyInterpreterState *interp)
16911692
// search functions, so this is done after everything else is initialized.
16921693
PyObject *mod = PyImport_ImportModule("encodings");
16931694
if (mod == NULL) {
1695+
PyThreadState *tstate = _PyThreadState_GET();
1696+
_Py_DumpPathConfig(tstate);
16941697
return PyStatus_Error("Failed to import encodings module");
16951698
}
16961699
Py_DECREF(mod);

0 commit comments

Comments
 (0)