| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- { Copyright 2019 Espressif Systems (Shanghai) PTE LTD
- SPDX-License-Identifier: Apache-2.0 }
- { ------------------------------ Find installed Python interpreters in Windows Registry (see PEP 514) ------------------------------ }
- var
- InstalledPythonVersions: TStringList;
- InstalledPythonDisplayNames: TStringList;
- InstalledPythonExecutables: TStringList;
- procedure PythonVersionAdd(Version, DisplayName, Executable: String);
- begin
- Log('Adding Python version=' + Version + ' name='+DisplayName+' executable='+Executable);
- InstalledPythonVersions.Append(Version);
- InstalledPythonDisplayNames.Append(DisplayName);
- InstalledPythonExecutables.Append(Executable);
- end;
- function GetPythonVersionInfoFromKey(RootKey: Integer; SubKeyName, CompanyName, TagName: String;
- var Version: String;
- var DisplayName: String;
- var ExecutablePath: String): Boolean;
- var
- TagKey, InstallPathKey, DefaultPath: String;
- begin
- TagKey := SubKeyName + '\' + CompanyName + '\' + TagName;
- InstallPathKey := TagKey + '\InstallPath';
- if not RegQueryStringValue(RootKey, InstallPathKey, '', DefaultPath) then
- begin
- Log('No (Default) key, skipping');
- Result := False;
- exit;
- end;
- if not RegQueryStringValue(RootKey, InstallPathKey, 'ExecutablePath', ExecutablePath) then
- begin
- Log('No ExecutablePath, using the default');
- ExecutablePath := DefaultPath + '\python.exe';
- end;
- if not RegQueryStringValue(RootKey, TagKey, 'SysVersion', Version) then
- begin
- if CompanyName = 'PythonCore' then
- begin
- Version := TagName;
- Delete(Version, 4, Length(Version));
- end else begin
- Log('Can not determine SysVersion');
- Result := False;
- exit;
- end;
- end;
- if not RegQueryStringValue(RootKey, TagKey, 'DisplayName', DisplayName) then
- begin
- DisplayName := 'Python ' + Version;
- end;
- Result := True;
- end;
- procedure FindPythonVersionsFromKey(RootKey: Integer; SubKeyName: String);
- var
- CompanyNames: TArrayOfString;
- CompanyName, CompanySubKey, TagName, TagSubKey: String;
- ExecutablePath, DisplayName, Version: String;
- TagNames: TArrayOfString;
- CompanyId, TagId: Integer;
- begin
- if not RegGetSubkeyNames(RootKey, SubKeyName, CompanyNames) then
- begin
- Log('Nothing found in ' + IntToStr(RootKey) + '\' + SubKeyName);
- Exit;
- end;
- for CompanyId := 0 to GetArrayLength(CompanyNames) - 1 do
- begin
- CompanyName := CompanyNames[CompanyId];
- if CompanyName = 'PyLauncher' then
- continue;
- CompanySubKey := SubKeyName + '\' + CompanyName;
- Log('In ' + IntToStr(RootKey) + '\' + CompanySubKey);
- if not RegGetSubkeyNames(RootKey, CompanySubKey, TagNames) then
- continue;
-
- for TagId := 0 to GetArrayLength(TagNames) - 1 do
- begin
- TagName := TagNames[TagId];
- TagSubKey := CompanySubKey + '\' + TagName;
- Log('In ' + IntToStr(RootKey) + '\' + TagSubKey);
- if not GetPythonVersionInfoFromKey(RootKey, SubKeyName, CompanyName, TagName, Version, DisplayName, ExecutablePath) then
- continue;
- PythonVersionAdd(Version, DisplayName, ExecutablePath);
- end;
- end;
- end;
- procedure FindInstalledPythonVersions();
- begin
- InstalledPythonVersions := TStringList.Create();
- InstalledPythonDisplayNames := TStringList.Create();
- InstalledPythonExecutables := TStringList.Create();
- FindPythonVersionsFromKey(HKEY_CURRENT_USER, 'Software\Python');
- FindPythonVersionsFromKey(HKEY_LOCAL_MACHINE, 'Software\Python');
- FindPythonVersionsFromKey(HKEY_LOCAL_MACHINE, 'Software\Wow6432Node\Python');
- end;
|