diff --git a/Lib/idlelib/PyShell.py b/Lib/idlelib/PyShell.py --- a/Lib/idlelib/PyShell.py +++ b/Lib/idlelib/PyShell.py @@ -61,7 +61,6 @@ lineno, line=line)) except OSError: pass ## file (probably __stderr__) is invalid, warning dropped. - warnings.showwarning = idle_showwarning def idle_formatwarning(message, category, filename, lineno, line=None): """Format warnings the IDLE way""" s = "\nWarning (from warnings module):\n" @@ -73,7 +72,27 @@ s += " %s\n" % line s += "%s: %s\n>>> " % (category.__name__, message) return s - warnings.formatwarning = idle_formatwarning + + _warnings_showwarning = None + _warnings_formatwarning = None + + def captureWarnings(capture): + global _warnings_showwarning, _warnings_formatwarning + if capture: + if _warnings_showwarning is None: + _warnings_showwarning = warnings.showwarning + warnings.showwarning = idle_showwarning + if _warnings_formatwarning is None: + _warnings_formatwarning = warnings.formatwarning + warnings.formatwarning = idle_formatwarning + else: + if _warnings_showwarning is not None: + warnings.showwarning = _warnings_showwarning + _warnings_showwarning = None + if _warnings_formatwarning is not None: + warnings.formatwarning = _warnings_formatwarning + _warnings_formatwarning = None + def extended_linecache_checkcache(filename=None, orig_checkcache=linecache.checkcache): @@ -1425,6 +1444,8 @@ def main(): global flist, root, use_subprocess + captureWarnings(True) + use_subprocess = True enable_shell = False enable_edit = False diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py --- a/Lib/idlelib/run.py +++ b/Lib/idlelib/run.py @@ -40,7 +40,19 @@ s += " %s\n" % line s += "%s: %s\n" % (category.__name__, message) return s - warnings.formatwarning = idle_formatwarning_subproc + + _warnings_formatwarning = None + + def captureWarnings(capture): + global _warnings_formatwarning + if capture: + if _warnings_formatwarning is None: + _warnings_formatwarning = warnings.formatwarning + warnings.formatwarning = idle_formatwarning_subproc + else: + if _warnings_formatwarning is not None: + warnings.formatwarning = _warnings_formatwarning + _warnings_formatwarning = None tcl = tkinter.Tcl() @@ -92,6 +104,7 @@ file=sys.__stderr__) return sys.argv[:] = [""] + captureWarnings(True) sockthread = threading.Thread(target=manage_socket, name='SockThread', args=((LOCALHOST, port),))