def process_tag(hive_name, company, company_key, tag, default_arch): with winreg.OpenKeyEx(company_key, tag) as tag_key: major, minor = load_version_data(hive_name, company, tag, tag_key) if major is None: return arch = load_arch_data(hive_name, company, tag, tag_key, default_arch) exe, args = load_exe(hive_name, company, company_key, tag) if exe is not None: name = "python" if company == "PythonCore" else company yield PythonSpec(name, major, minor, arch, exe, args)
def process_set(hive, hive_name, key, flags, default_arch): try: with winreg.OpenKeyEx(hive, key, 0, winreg.KEY_READ | flags) as root_key: for company in enum_keys(root_key): if company == "PyLauncher": # reserved continue for spec in process_company(hive_name, company, root_key, default_arch): yield spec except OSError: pass
def load_exe(hive_name, company, company_key, tag): key_path = "{}/{}/{}".format(hive_name, company, tag) try: with winreg.OpenKeyEx(company_key, r"{}\InstallPath".format(tag)) as ip_key: with ip_key: exe = get_value(ip_key, "ExecutablePath") if exe is None: ip = get_value(ip_key, None) if ip is None: msg(key_path, "no ExecutablePath or default for it") else: exe = os.path.join(ip, "python.exe") if os.path.exists(exe): args = get_value(ip_key, "ExecutableArguments") return exe, args else: msg(key_path, "exe does not exists {}".format(exe)) except OSError: msg("{}/{}".format(key_path, "InstallPath"), "missing") return None, None
def process_company(hive_name, company, root_key, default_arch): with winreg.OpenKeyEx(root_key, company) as company_key: for tag in enum_keys(company_key): for spec in process_tag(hive_name, company, company_key, tag, default_arch): yield spec