]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-140648: Make asyncio REPL respect the `-I` flag (isolated mode) (GH-143045...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sat, 3 Jan 2026 08:29:05 +0000 (09:29 +0100)
committerGitHub <noreply@github.com>
Sat, 3 Jan 2026 08:29:05 +0000 (08:29 +0000)
gh-140648: Make asyncio REPL respect the `-I` flag (isolated mode) (GH-143045)
(cherry picked from commit e7c542de5f069a4b83e8eded3067613e4d59a529)

Co-authored-by: Bartosz Sławecki <bartosz@ilikepython.com>
Lib/asyncio/__main__.py
Lib/test/test_repl.py
Misc/NEWS.d/next/Library/2025-12-21-17-24-29.gh-issue-140648.i8dca6.rst [new file with mode: 0644]

index 64f9b3c54e4a4de05d80a9983faeabd5372439f0..0e100358022a959ef6ed5f154abee92052612eb6 100644 (file)
@@ -96,7 +96,7 @@ class REPLThread(threading.Thread):
 
                 console.write(banner)
 
-            if startup_path := os.getenv("PYTHONSTARTUP"):
+            if not sys.flags.isolated and (startup_path := os.getenv("PYTHONSTARTUP")):
                 sys.audit("cpython.run_startup", startup_path)
 
                 import tokenize
index 17bc53d20c39d2fd4d453b297d41fc58377a405d..b55a5180c677866aa60d71e801a688ef5664904f 100644 (file)
@@ -28,7 +28,7 @@ if not has_subprocess_support:
     raise unittest.SkipTest("test module requires subprocess")
 
 
-def spawn_repl(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, custom=False, **kw):
+def spawn_repl(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, custom=False, isolated=True, **kw):
     """Run the Python REPL with the given arguments.
 
     kw is extra keyword args to pass to subprocess.Popen. Returns a Popen
@@ -42,7 +42,10 @@ def spawn_repl(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, custom=F
     # path may be used by Py_GetPath() to build the default module search
     # path.
     stdin_fname = os.path.join(os.path.dirname(sys.executable), "<stdin>")
-    cmd_line = [stdin_fname, '-I']
+    cmd_line = [stdin_fname]
+    # Isolated mode implies -EPs and ignores PYTHON* variables.
+    if isolated:
+        cmd_line.append('-I')
     # Don't re-run the built-in REPL from interactive mode
     # if we're testing a custom REPL (such as the asyncio REPL).
     if not custom:
@@ -215,7 +218,7 @@ class TestInteractiveInterpreter(unittest.TestCase):
         with os_helper.temp_dir() as tmpdir:
             script = os.path.join(tmpdir, "pythonstartup.py")
             with open(script, "w") as f:
-                f.write("print('from pythonstartup')" + os.linesep)
+                f.write("print('from pythonstartup')\n")
 
             env = os.environ.copy()
             env['PYTHONSTARTUP'] = script
@@ -296,19 +299,27 @@ class TestInteractiveInterpreter(unittest.TestCase):
         with os_helper.temp_dir() as tmpdir:
             script = os.path.join(tmpdir, "pythonstartup.py")
             with open(script, "w") as f:
-                f.write("print('pythonstartup done!')" + os.linesep)
-                f.write("exit(0)" + os.linesep)
+                f.write("print('pythonstartup done!')\n")
+            env = os.environ.copy()
+            env["PYTHON_HISTORY"] = os.path.join(tmpdir, ".asyncio_history")
+            env["PYTHONSTARTUP"] = script
+            p = spawn_asyncio_repl(isolated=False, env=env)
+            output = kill_python(p)
+            self.assertEqual(p.returncode, 0)
+            self.assertIn("pythonstartup done!", output)
 
+    def test_asyncio_repl_respects_isolated_mode(self):
+        with os_helper.temp_dir() as tmpdir:
+            script = os.path.join(tmpdir, "pythonstartup.py")
+            with open(script, "w") as f:
+                f.write("print('should not print')\n")
             env = os.environ.copy()
             env["PYTHON_HISTORY"] = os.path.join(tmpdir, ".asyncio_history")
             env["PYTHONSTARTUP"] = script
-            subprocess.check_call(
-                [sys.executable, "-m", "asyncio"],
-                stdout=subprocess.PIPE,
-                stderr=subprocess.PIPE,
-                env=env,
-                timeout=SHORT_TIMEOUT,
-            )
+            p = spawn_asyncio_repl(isolated=True, env=env)
+            output = kill_python(p)
+            self.assertEqual(p.returncode, 0)
+            self.assertNotIn("should not print", output)
 
     @unittest.skipUnless(pty, "requires pty")
     def test_asyncio_repl_is_ok(self):
diff --git a/Misc/NEWS.d/next/Library/2025-12-21-17-24-29.gh-issue-140648.i8dca6.rst b/Misc/NEWS.d/next/Library/2025-12-21-17-24-29.gh-issue-140648.i8dca6.rst
new file mode 100644 (file)
index 0000000..9e56f09
--- /dev/null
@@ -0,0 +1,3 @@
+The :mod:`asyncio` REPL now respects the :option:`-I` flag (isolated mode).
+Previously, it would load and execute :envvar:`PYTHONSTARTUP` even if the
+flag was set. Contributed by Bartosz SÅ‚awecki.