python: rework how we compute the "command" property (#46850)

Some Windows Python installations may store the Python exe in Scripts/
rather than the base directory. Update `.command` to search in both
locations on Windows. On all systems, the search is now done
recursively from the search root: on Windows, that is the base install
directory, and on other systems it is bin/.
This commit is contained in:
Massimiliano Culpo 2024-10-09 09:08:27 +02:00 committed by GitHub
parent 6d67992191
commit 8e4e3c9060
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 12 additions and 10 deletions

View File

@ -47,6 +47,7 @@
"copy_mode",
"filter_file",
"find",
"find_first",
"find_headers",
"find_all_headers",
"find_libraries",

View File

@ -858,14 +858,14 @@ def command(self):
# * python
#
# in that order if using python@3.11.0, for example.
version = self.spec.version
for ver in [version.up_to(2), version.up_to(1), ""]:
if sys.platform != "win32":
path = os.path.join(self.prefix.bin, "python{0}".format(ver))
else:
path = os.path.join(self.prefix, "python{0}.exe".format(ver))
if os.path.exists(path):
return Executable(path)
suffixes = [self.spec.version.up_to(2), self.spec.version.up_to(1), ""]
file_extension = "" if sys.platform != "win32" else ".exe"
patterns = [f"python{ver}{file_extension}" for ver in suffixes]
root = self.prefix.bin if sys.platform != "win32" else self.prefix
path = find_first(root, files=patterns)
if path is not None:
return Executable(path)
else:
# Give a last try at rhel8 platform python
@ -874,8 +874,9 @@ def command(self):
if os.path.exists(path):
return Executable(path)
msg = "Unable to locate {0} command in {1}"
raise RuntimeError(msg.format(self.name, self.prefix.bin))
raise RuntimeError(
f"cannot to locate the '{self.name}' command in {root} or its subdirectories"
)
@property
def config_vars(self):