summaryrefslogtreecommitdiffstats
path: root/Modules/getpath.py
diff options
context:
space:
mode:
authorVincent Fazio <vfazio@gmail.com>2022-11-10 16:26:42 (GMT)
committerGitHub <noreply@github.com>2022-11-10 16:26:42 (GMT)
commitc41b13d39ccc2d6e239782de99ba8e3cdd061e5a (patch)
tree075f0b3abf5024b4aab968a7d8e5e34eaf35b144 /Modules/getpath.py
parentf1680c3fbf7d18a1b3a5b390c433298bb6b9fcac (diff)
downloadcpython-c41b13d39ccc2d6e239782de99ba8e3cdd061e5a.zip
cpython-c41b13d39ccc2d6e239782de99ba8e3cdd061e5a.tar.gz
cpython-c41b13d39ccc2d6e239782de99ba8e3cdd061e5a.tar.bz2
gh-99204: Calculate base_executable by alternate names in POSIX venvs (GH-99206)
Check to see if `base_executable` exists. If it does not, attempt to use known alternative names of the python binary to find an executable in the path specified by `home`. If no alternative is found, previous behavior is preserved. Signed-off-by: Vincent Fazio <vfazio@gmail.com> Signed-off-by: Vincent Fazio <vfazio@gmail.com>
Diffstat (limited to 'Modules/getpath.py')
-rw-r--r--Modules/getpath.py19
1 files changed, 19 insertions, 0 deletions
diff --git a/Modules/getpath.py b/Modules/getpath.py
index 90a6473..d24b152 100644
--- a/Modules/getpath.py
+++ b/Modules/getpath.py
@@ -375,6 +375,25 @@ if not home and not py_setpath:
pass
if not base_executable:
base_executable = joinpath(executable_dir, basename(executable))
+ # It's possible "python" is executed from within a posix venv but that
+ # "python" is not available in the "home" directory as the standard
+ # `make install` does not create it and distros often do not provide it.
+ #
+ # In this case, try to fall back to known alternatives
+ if os_name != 'nt' and not isfile(base_executable):
+ base_exe = basename(executable)
+ for candidate in (DEFAULT_PROGRAM_NAME, f'python{VERSION_MAJOR}.{VERSION_MINOR}'):
+ candidate += EXE_SUFFIX if EXE_SUFFIX else ''
+ if base_exe == candidate:
+ continue
+ candidate = joinpath(executable_dir, candidate)
+ # Only set base_executable if the candidate exists.
+ # If no candidate succeeds, subsequent errors related to
+ # base_executable (like FileNotFoundError) remain in the
+ # context of the original executable name
+ if isfile(candidate):
+ base_executable = candidate
+ break
break
else:
venv_prefix = None