mirror of
https://github.com/python/cpython.git
synced 2025-08-27 04:05:34 +00:00
bpo-46028: Calculate base_executable by resolving symlinks in a venv (GH-30144)
This commit is contained in:
parent
32398294fb
commit
7407fe4c25
3 changed files with 47 additions and 1 deletions
|
@ -328,6 +328,38 @@ class MockGetPathTests(unittest.TestCase):
|
||||||
actual = getpath(ns, expected)
|
actual = getpath(ns, expected)
|
||||||
self.assertEqual(expected, actual)
|
self.assertEqual(expected, actual)
|
||||||
|
|
||||||
|
def test_venv_changed_name_posix(self):
|
||||||
|
"Test a venv layout on *nix."
|
||||||
|
ns = MockPosixNamespace(
|
||||||
|
argv0="python",
|
||||||
|
PREFIX="/usr",
|
||||||
|
ENV_PATH="/venv/bin:/usr/bin",
|
||||||
|
)
|
||||||
|
ns.add_known_xfile("/usr/bin/python3")
|
||||||
|
ns.add_known_xfile("/venv/bin/python")
|
||||||
|
ns.add_known_link("/venv/bin/python", "/usr/bin/python3")
|
||||||
|
ns.add_known_file("/usr/lib/python9.8/os.py")
|
||||||
|
ns.add_known_dir("/usr/lib/python9.8/lib-dynload")
|
||||||
|
ns.add_known_file("/venv/pyvenv.cfg", [
|
||||||
|
r"home = /usr/bin"
|
||||||
|
])
|
||||||
|
expected = dict(
|
||||||
|
executable="/venv/bin/python",
|
||||||
|
prefix="/usr",
|
||||||
|
exec_prefix="/usr",
|
||||||
|
base_executable="/usr/bin/python3",
|
||||||
|
base_prefix="/usr",
|
||||||
|
base_exec_prefix="/usr",
|
||||||
|
module_search_paths_set=1,
|
||||||
|
module_search_paths=[
|
||||||
|
"/usr/lib/python98.zip",
|
||||||
|
"/usr/lib/python9.8",
|
||||||
|
"/usr/lib/python9.8/lib-dynload",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
actual = getpath(ns, expected)
|
||||||
|
self.assertEqual(expected, actual)
|
||||||
|
|
||||||
def test_symlink_normal_posix(self):
|
def test_symlink_normal_posix(self):
|
||||||
"Test a 'standard' install layout via symlink on *nix"
|
"Test a 'standard' install layout via symlink on *nix"
|
||||||
ns = MockPosixNamespace(
|
ns = MockPosixNamespace(
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Fixes calculation of :data:`sys._base_executable` when inside a virtual
|
||||||
|
environment that uses symlinks with different binary names than the base
|
||||||
|
environment provides.
|
|
@ -351,7 +351,18 @@ if not home and not py_setpath:
|
||||||
key, had_equ, value = line.partition('=')
|
key, had_equ, value = line.partition('=')
|
||||||
if had_equ and key.strip().lower() == 'home':
|
if had_equ and key.strip().lower() == 'home':
|
||||||
executable_dir = real_executable_dir = value.strip()
|
executable_dir = real_executable_dir = value.strip()
|
||||||
base_executable = joinpath(executable_dir, basename(executable))
|
if not base_executable:
|
||||||
|
# First try to resolve symlinked executables, since that may be
|
||||||
|
# more accurate than assuming the executable in 'home'.
|
||||||
|
try:
|
||||||
|
base_executable = realpath(executable)
|
||||||
|
if base_executable == executable:
|
||||||
|
# No change, so probably not a link. Clear it and fall back
|
||||||
|
base_executable = ''
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
if not base_executable:
|
||||||
|
base_executable = joinpath(executable_dir, basename(executable))
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
venv_prefix = None
|
venv_prefix = None
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue