mirror of
https://github.com/python/cpython.git
synced 2026-07-23 10:26:31 -04:00
[3.15] gh-134300: Remove idlelib from the path of the IDLE user process (GH-152739) (#152807)
gh-134300: Remove idlelib from the path of the IDLE user process (GH-152739)
The idlelib directory ends up on sys.path when idle.py is run as a script,
and it was passed to the user process, where it let user code import
idlelib submodules as top-level modules, such as "import help".
(cherry picked from commit 3f5491a092)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
This commit is contained in:
committed by
GitHub
parent
c2d2752028
commit
6aa89d98e3
@@ -2,6 +2,7 @@
|
||||
# Plus coverage of test_warning. Was 20% with test_openshell.
|
||||
|
||||
from idlelib import pyshell
|
||||
import os
|
||||
import unittest
|
||||
from test.support import requires
|
||||
from tkinter import Tk
|
||||
@@ -28,6 +29,14 @@ class FunctionTest(unittest.TestCase):
|
||||
self.assertEqual(pyshell.restart_line(width, ''), expect)
|
||||
self.assertEqual(pyshell.restart_line(taglen+2, ''), expect+' =')
|
||||
|
||||
def test_fix_user_path(self):
|
||||
# gh-134300: the idlelib directory is removed, other entries kept.
|
||||
eq = self.assertEqual
|
||||
idlelib_dir = os.path.dirname(os.path.abspath(pyshell.__file__))
|
||||
eq(pyshell.fix_user_path(['', '/a', idlelib_dir, '/b']), ['', '/a', '/b'])
|
||||
eq(pyshell.fix_user_path(['/a', '/b']), ['/a', '/b'])
|
||||
eq(pyshell.fix_user_path([idlelib_dir]), [])
|
||||
|
||||
|
||||
class PyShellFileListTest(unittest.TestCase):
|
||||
|
||||
|
||||
@@ -408,6 +408,17 @@ def restart_line(width, filename): # See bpo-38141.
|
||||
return tag[:-2] # Remove ' ='.
|
||||
|
||||
|
||||
def fix_user_path(path):
|
||||
"""Return path without the idlelib directory (gh-134300).
|
||||
|
||||
That directory is on sys.path when idle.py is run as a script.
|
||||
Otherwise user code could import idlelib submodules as top-level
|
||||
modules, such as "import help".
|
||||
"""
|
||||
idlelib_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
return [p for p in path if p != idlelib_dir]
|
||||
|
||||
|
||||
class ModifiedInterpreter(InteractiveInterpreter):
|
||||
|
||||
def __init__(self, tkconsole):
|
||||
@@ -568,6 +579,7 @@ class ModifiedInterpreter(InteractiveInterpreter):
|
||||
path.extend(sys.path)
|
||||
else:
|
||||
path = sys.path
|
||||
path = fix_user_path(path) # gh-134300
|
||||
|
||||
self.runcommand("""if 1:
|
||||
import sys as _sys
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
Do not add the ``idlelib`` directory to the path of the IDLE user process.
|
||||
User code run in IDLE can no longer import ``idlelib`` submodules as
|
||||
top-level modules, such as ``import help``.
|
||||
Reference in New Issue
Block a user