mirror of
https://github.com/python/cpython.git
synced 2026-05-18 18:33:57 -04:00
Issue #3137: Don't ignore errors at startup, especially a keyboard interrupt
(SIGINT). If an error occurs while importing the site module, the error is printed and Python exits. Initialize the GIL before importing the site module.
This commit is contained in:
+16
-16
@@ -248,14 +248,15 @@ Py_InitializeEx(int install_sigs)
|
||||
}
|
||||
|
||||
initmain(); /* Module __main__ */
|
||||
if (!Py_NoSiteFlag)
|
||||
initsite(); /* Module site */
|
||||
|
||||
/* auto-thread-state API, if available */
|
||||
#ifdef WITH_THREAD
|
||||
_PyGILState_Init(interp, tstate);
|
||||
#endif /* WITH_THREAD */
|
||||
|
||||
if (!Py_NoSiteFlag)
|
||||
initsite(); /* Module site */
|
||||
|
||||
if ((p = Py_GETENV("PYTHONIOENCODING")) && *p != '\0') {
|
||||
p = icodeset = codeset = strdup(p);
|
||||
free_codeset = 1;
|
||||
@@ -284,8 +285,13 @@ Py_InitializeEx(int install_sigs)
|
||||
loc_codeset = strdup(loc_codeset);
|
||||
Py_DECREF(enc);
|
||||
} else {
|
||||
loc_codeset = NULL;
|
||||
PyErr_Clear();
|
||||
if (PyErr_ExceptionMatches(PyExc_LookupError)) {
|
||||
PyErr_Clear();
|
||||
loc_codeset = NULL;
|
||||
} else {
|
||||
PyErr_Print();
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
} else
|
||||
loc_codeset = NULL;
|
||||
@@ -704,20 +710,12 @@ initmain(void)
|
||||
static void
|
||||
initsite(void)
|
||||
{
|
||||
PyObject *m, *f;
|
||||
PyObject *m;
|
||||
m = PyImport_ImportModule("site");
|
||||
if (m == NULL) {
|
||||
f = PySys_GetObject("stderr");
|
||||
if (Py_VerboseFlag) {
|
||||
PyFile_WriteString(
|
||||
"'import site' failed; traceback:\n", f);
|
||||
PyErr_Print();
|
||||
}
|
||||
else {
|
||||
PyFile_WriteString(
|
||||
"'import site' failed; use -v for traceback\n", f);
|
||||
PyErr_Clear();
|
||||
}
|
||||
PyErr_Print();
|
||||
Py_Finalize();
|
||||
exit(1);
|
||||
}
|
||||
else {
|
||||
Py_DECREF(m);
|
||||
@@ -1546,6 +1544,8 @@ err_input(perrdetail *err)
|
||||
char *msg = NULL;
|
||||
errtype = PyExc_SyntaxError;
|
||||
switch (err->error) {
|
||||
case E_ERROR:
|
||||
return;
|
||||
case E_SYNTAX:
|
||||
errtype = PyExc_IndentationError;
|
||||
if (err->expected == INDENT)
|
||||
|
||||
Reference in New Issue
Block a user