From ea1642910eafe86b6749af852ce5b37525b742c8 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 21 Mar 2010 14:02:32 +0000 Subject: Partial backport of r78826: leave import site error handler unchanged (print the error and continue). Merged revisions 78826-78827 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r78826 | victor.stinner | 2010-03-10 23:30:19 +0100 (mer., 10 mars 2010) | 5 lines 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. ........ r78827 | victor.stinner | 2010-03-10 23:45:04 +0100 (mer., 10 mars 2010) | 4 lines ooops, fix error message in execusercustomize() Copy/paste failure :-) ........ --- Lib/site.py | 12 ++++++++++++ Modules/main.c | 14 ++++++++++---- Parser/tokenizer.c | 6 +++++- Python/import.c | 2 -- Python/pythonrun.c | 16 ++++++++++++---- 5 files changed, 39 insertions(+), 11 deletions(-) diff --git a/Lib/site.py b/Lib/site.py index 21c7db2..66c56c2 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -472,6 +472,12 @@ def execsitecustomize(): import sitecustomize except ImportError: pass + except Exception: + if sys.flags.verbose: + sys.excepthook(*sys.exc_info()) + else: + print >>sys.stderr, \ + "'import sitecustomize' failed; use -v for traceback" def execusercustomize(): @@ -480,6 +486,12 @@ def execusercustomize(): import usercustomize except ImportError: pass + except Exception: + if sys.flags.verbose: + sys.excepthook(*sys.exc_info()) + else: + print>>sys.stderr, \ + "'import usercustomize' failed; use -v for traceback" def main(): diff --git a/Modules/main.c b/Modules/main.c index 2d2bbf4..de0c851 100644 --- a/Modules/main.c +++ b/Modules/main.c @@ -569,10 +569,16 @@ Py_Main(int argc, char **argv) } if (sts==-1) { - sts = PyRun_AnyFileExFlags( - fp, - filename == NULL ? "" : filename, - filename != NULL, &cf) != 0; + /* call pending calls like signal handlers (SIGINT) */ + if (Py_MakePendingCalls() == -1) { + PyErr_Print(); + sts = 1; + } else { + sts = PyRun_AnyFileExFlags( + fp, + filename == NULL ? "" : filename, + filename != NULL, &cf) != 0; + } } } diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 79f1fa8..b84a154 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -764,8 +764,12 @@ error_nomem: return -1; error_clear: - /* Fallback to iso-8859-1: for backward compatibility */ Py_DECREF(enc); + if (!PyErr_ExceptionMatches(PyExc_UnicodeDecodeError)) { + tok->done = E_ERROR; + return -1; + } + /* Fallback to iso-8859-1: for backward compatibility */ PyErr_Clear(); return 0; } diff --git a/Python/import.c b/Python/import.c index 43eabb8..eb731d0 100644 --- a/Python/import.c +++ b/Python/import.c @@ -2744,8 +2744,6 @@ PyImport_Import(PyObject *module_name) } else { /* No globals -- use standard builtins, and fake globals */ - PyErr_Clear(); - builtins = PyImport_ImportModuleLevel("__builtin__", NULL, NULL, NULL, 0); if (builtins == NULL) diff --git a/Python/pythonrun.c b/Python/pythonrun.c index f0dcfb3..3ea4d8c 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -245,14 +245,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; @@ -281,8 +282,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; @@ -1543,6 +1549,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) -- cgit v0.12