diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 94fcc6725ec..906877a0a85 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1032,6 +1032,17 @@ static PyObject * run_eval_code_obj(PyCodeObject *co, PyObject *globals, PyObject *locals) { PyObject *v; + /* + * We explicitly re-initialize _Py_UnhandledKeyboardInterrupt every eval + * _just in case_ someone is calling into an embedded Python where they + * don't care about an uncaught KeyboardInterrupt exception (why didn't they + * leave config.install_signal_handlers set to 0?!?) but then later call + * Py_Main() itself (which _checks_ this flag and dies with a signal after + * its interpreter exits). We don't want a previous embedded interpreter's + * uncaught exception to trigger an unexplained signal exit from a future + * Py_Main() based one. + */ + _Py_UnhandledKeyboardInterrupt = 0; v = PyEval_EvalCode((PyObject*)co, globals, locals); if (!v && PyErr_Occurred() == PyExc_KeyboardInterrupt) { _Py_UnhandledKeyboardInterrupt = 1;