From 029a359ff98bf2f7ecfe6066c9c831cb2cfbcb49 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 5 Aug 2025 20:25:47 +0100 Subject: [PATCH 1/2] gh-120037: Disable user site packages when a ._pth file is used --- Doc/c-api/init_config.rst | 7 +++++++ .../2025-08-05-20-24-12.gh-issue-120037.MB7MmI.rst | 2 ++ Modules/getpath.py | 1 + 3 files changed, 10 insertions(+) create mode 100644 Misc/NEWS.d/next/Core_and_Builtins/2025-08-05-20-24-12.gh-issue-120037.MB7MmI.rst diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst index 24be9ead3874d1..4f0199838e151d 100644 --- a/Doc/c-api/init_config.rst +++ b/Doc/c-api/init_config.rst @@ -2258,6 +2258,7 @@ If a ``._pth`` file is present: * Set :c:member:`~PyConfig.isolated` to ``1``. * Set :c:member:`~PyConfig.use_environment` to ``0``. * Set :c:member:`~PyConfig.site_import` to ``0``. +* Set :c:member:`~PyConfig.user_site_directory` to ``0`` (since 3.15). * Set :c:member:`~PyConfig.safe_path` to ``1``. If :c:member:`~PyConfig.home` is not set and a ``pyvenv.cfg`` file is present in @@ -2278,6 +2279,12 @@ The ``__PYVENV_LAUNCHER__`` environment variable is used to set therefore affected by :option:`-S`. +.. versionchanged:: 3.15 + + :c:member:`~PyConfig.user_site_directory` is now set to ``0`` when a + ``._pth`` file is present. + + Py_GetArgcArgv() ================ diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-08-05-20-24-12.gh-issue-120037.MB7MmI.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-05-20-24-12.gh-issue-120037.MB7MmI.rst new file mode 100644 index 00000000000000..15b8b8f3648ac6 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-08-05-20-24-12.gh-issue-120037.MB7MmI.rst @@ -0,0 +1,2 @@ +Disable user site packages directory when a ``._pth`` file is used, even if +it contains ``import site``. diff --git a/Modules/getpath.py b/Modules/getpath.py index b89d7427e3febd..ceb605a75c85f4 100644 --- a/Modules/getpath.py +++ b/Modules/getpath.py @@ -790,6 +790,7 @@ def search_up(prefix, *landmarks, test=isfile): config['isolated'] = 1 config['use_environment'] = 0 config['site_import'] = 0 + config['user_site_directory'] = 0 config['safe_path'] = 1 pythonpath = [] for line in pth: From 7dde5c0cf543e218ed9ecfa6e1825f560269eef2 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 5 Aug 2025 20:28:30 +0100 Subject: [PATCH 2/2] Add test --- Lib/test/test_site.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py index d0e3294263557e..e34c3528f6a9b3 100644 --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -802,6 +802,15 @@ def test_underpth_dll_file(self): )], env=env) self.assertTrue(rc, "sys.path is incorrect") + @support.requires_subprocess() + def test_underpth_no_user_site(self): + pth_lines = [test.support.STDLIB_DIR, 'import site'] + exe_file = self._create_underpth_exe(pth_lines) + p = subprocess.run([exe_file, '-X', 'utf8', '-c', + 'import sys; ' + 'sys.exit(not sys.flags.no_user_site)']) + self.assertEqual(p.returncode, 0, "sys.flags.no_user_site was 0") + if __name__ == "__main__": unittest.main()