python_find_installed.iss.inc 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. { Copyright 2019 Espressif Systems (Shanghai) PTE LTD
  2. SPDX-License-Identifier: Apache-2.0 }
  3. { ------------------------------ Find installed Python interpreters in Windows Registry (see PEP 514) ------------------------------ }
  4. var
  5. InstalledPythonVersions: TStringList;
  6. InstalledPythonDisplayNames: TStringList;
  7. InstalledPythonExecutables: TStringList;
  8. procedure PythonVersionAdd(Version, DisplayName, Executable: String);
  9. begin
  10. Log('Adding Python version=' + Version + ' name='+DisplayName+' executable='+Executable);
  11. InstalledPythonVersions.Append(Version);
  12. InstalledPythonDisplayNames.Append(DisplayName);
  13. InstalledPythonExecutables.Append(Executable);
  14. end;
  15. function GetPythonVersionInfoFromKey(RootKey: Integer; SubKeyName, CompanyName, TagName: String;
  16. var Version: String;
  17. var DisplayName: String;
  18. var ExecutablePath: String): Boolean;
  19. var
  20. TagKey, InstallPathKey, DefaultPath: String;
  21. begin
  22. TagKey := SubKeyName + '\' + CompanyName + '\' + TagName;
  23. InstallPathKey := TagKey + '\InstallPath';
  24. if not RegQueryStringValue(RootKey, InstallPathKey, '', DefaultPath) then
  25. begin
  26. Log('No (Default) key, skipping');
  27. Result := False;
  28. exit;
  29. end;
  30. if not RegQueryStringValue(RootKey, InstallPathKey, 'ExecutablePath', ExecutablePath) then
  31. begin
  32. Log('No ExecutablePath, using the default');
  33. ExecutablePath := DefaultPath + '\python.exe';
  34. end;
  35. if not RegQueryStringValue(RootKey, TagKey, 'SysVersion', Version) then
  36. begin
  37. if CompanyName = 'PythonCore' then
  38. begin
  39. Version := TagName;
  40. Delete(Version, 4, Length(Version));
  41. end else begin
  42. Log('Can not determine SysVersion');
  43. Result := False;
  44. exit;
  45. end;
  46. end;
  47. if not RegQueryStringValue(RootKey, TagKey, 'DisplayName', DisplayName) then
  48. begin
  49. DisplayName := 'Python ' + Version;
  50. end;
  51. Result := True;
  52. end;
  53. procedure FindPythonVersionsFromKey(RootKey: Integer; SubKeyName: String);
  54. var
  55. CompanyNames: TArrayOfString;
  56. CompanyName, CompanySubKey, TagName, TagSubKey: String;
  57. ExecutablePath, DisplayName, Version: String;
  58. TagNames: TArrayOfString;
  59. CompanyId, TagId: Integer;
  60. begin
  61. if not RegGetSubkeyNames(RootKey, SubKeyName, CompanyNames) then
  62. begin
  63. Log('Nothing found in ' + IntToStr(RootKey) + '\' + SubKeyName);
  64. Exit;
  65. end;
  66. for CompanyId := 0 to GetArrayLength(CompanyNames) - 1 do
  67. begin
  68. CompanyName := CompanyNames[CompanyId];
  69. if CompanyName = 'PyLauncher' then
  70. continue;
  71. CompanySubKey := SubKeyName + '\' + CompanyName;
  72. Log('In ' + IntToStr(RootKey) + '\' + CompanySubKey);
  73. if not RegGetSubkeyNames(RootKey, CompanySubKey, TagNames) then
  74. continue;
  75. for TagId := 0 to GetArrayLength(TagNames) - 1 do
  76. begin
  77. TagName := TagNames[TagId];
  78. TagSubKey := CompanySubKey + '\' + TagName;
  79. Log('In ' + IntToStr(RootKey) + '\' + TagSubKey);
  80. if not GetPythonVersionInfoFromKey(RootKey, SubKeyName, CompanyName, TagName, Version, DisplayName, ExecutablePath) then
  81. continue;
  82. PythonVersionAdd(Version, DisplayName, ExecutablePath);
  83. end;
  84. end;
  85. end;
  86. procedure FindInstalledPythonVersions();
  87. begin
  88. InstalledPythonVersions := TStringList.Create();
  89. InstalledPythonDisplayNames := TStringList.Create();
  90. InstalledPythonExecutables := TStringList.Create();
  91. FindPythonVersionsFromKey(HKEY_CURRENT_USER, 'Software\Python');
  92. FindPythonVersionsFromKey(HKEY_LOCAL_MACHINE, 'Software\Python');
  93. FindPythonVersionsFromKey(HKEY_LOCAL_MACHINE, 'Software\Wow6432Node\Python');
  94. end;