[Python-checkins] bpo-37038: Make idlelib.run runnable; add test clause (GH-13560)

Terry Jan Reedy webhook-mailer at python.org
Fri May 24 21:59:57 EDT 2019


https://github.com/python/cpython/commit/81bb97df6138c755e229dcdac9bed747e31b61b3
commit: 81bb97df6138c755e229dcdac9bed747e31b61b3
branch: master
author: Terry Jan Reedy <tjreedy at udel.edu>
committer: GitHub <noreply at github.com>
date: 2019-05-24T21:59:53-04:00
summary:

bpo-37038: Make idlelib.run runnable; add test clause (GH-13560)

files:
A Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst
M Lib/idlelib/NEWS.txt
M Lib/idlelib/run.py

diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt
index 3f19ce737396..e1bc009ae933 100644
--- a/Lib/idlelib/NEWS.txt
+++ b/Lib/idlelib/NEWS.txt
@@ -3,6 +3,8 @@ Released on 2019-10-20?
 ======================================
 
 
+bpo-37038: Make idlelib.run runnable; add test clause.
+
 bpo-36958: Print any argument other than None or int passed to
 SystemExit or sys.exit().
 
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
index b4a2b54a33c8..4075deec51d8 100644
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -1,3 +1,9 @@
+""" idlelib.run
+
+Simplified, pyshell.ModifiedInterpreter spawns a subprocess with
+f'''{sys.executable} -c "__import__('idlelib.run').run.main()"'''
+'.run' is needed because __import__ returns idlelib, not idlelib.run.
+"""
 import io
 import linecache
 import queue
@@ -8,8 +14,6 @@
 import threading
 import warnings
 
-import tkinter  # Tcl, deletions, messagebox if startup fails
-
 from idlelib import autocomplete  # AutoComplete, fetch_encodings
 from idlelib import calltip  # Calltip
 from idlelib import debugger_r  # start_debugger
@@ -19,11 +23,16 @@
 from idlelib import stackviewer  # StackTreeItem
 import __main__
 
-for mod in ('simpledialog', 'messagebox', 'font',
-            'dialog', 'filedialog', 'commondialog',
-            'ttk'):
-    delattr(tkinter, mod)
-    del sys.modules['tkinter.' + mod]
+import tkinter  # Use tcl and, if startup fails, messagebox.
+if not hasattr(sys.modules['idlelib.run'], 'firstrun'):
+    # Undo modifications of tkinter by idlelib imports; see bpo-25507.
+    for mod in ('simpledialog', 'messagebox', 'font',
+                'dialog', 'filedialog', 'commondialog',
+                'ttk'):
+        delattr(tkinter, mod)
+        del sys.modules['tkinter.' + mod]
+    # Avoid AttributeError if run again; see bpo-37038.
+    sys.modules['idlelib.run'].firstrun = False
 
 LOCALHOST = '127.0.0.1'
 
@@ -523,4 +532,9 @@ def stackviewer(self, flist_oid=None):
         item = stackviewer.StackTreeItem(flist, tb)
         return debugobj_r.remote_object_tree_item(item)
 
-capture_warnings(False)  # Make sure turned off; see issue 18081
+
+if __name__ == '__main__':
+    from unittest import main
+    main('idlelib.idle_test.test_run', verbosity=2)
+
+capture_warnings(False)  # Make sure turned off; see bpo-18081.
diff --git a/Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst b/Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst
new file mode 100644
index 000000000000..762e9f1e4374
--- /dev/null
+++ b/Misc/NEWS.d/next/IDLE/2019-05-24-18-57-57.bpo-37038.AJ3RwQ.rst
@@ -0,0 +1 @@
+Make idlelib.run runnable; add test clause.



More information about the Python-checkins mailing list