📜  使用Python获取 Windows 中已安装软件的列表(1)

📅  最后修改于: 2023-12-03 15:22:20.606000             🧑  作者: Mango

使用 Python 获取 Windows 中已安装软件的列表

当我们需要获取 Windows 操作系统中已安装的软件列表时,可以使用 Python 并通过 Windows 的注册表(Registry)进行查询。下面是一个示例程序,可以实现该功能。

代码实现
import winreg

def get_installed_software_list():
    software_list = []
    reg_path = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
    try:
        reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE)
        key = winreg.OpenKey(reg, reg_path, 0, winreg.KEY_READ)
    except WindowsError:
        return None

    i = 0
    while True:
        try:
            subkey = winreg.EnumKey(key, i)
            subkey_path = reg_path + "\\" + subkey
            try:
                subkey_key = winreg.OpenKey(reg, subkey_path, 0, winreg.KEY_READ)
                displayName, _ = winreg.QueryValueEx(subkey_key, "DisplayName")
                displayVersion, _ = winreg.QueryValueEx(subkey_key, "DisplayVersion")
                software_list.append((displayName, displayVersion))
                winreg.CloseKey(subkey_key)
            except WindowsError:
                pass
            i += 1
        except WindowsError:
            break

    winreg.CloseKey(key)
    winreg.CloseKey(reg)

    return software_list
代码说明

该程序查询了 Windows 操作系统中的注册表,访问了 "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" 下的各个子键,通过各个子键中的 "DisplayName" 和 "DisplayVersion" 字段获取软件名称和版本号。

该程序返回一个包含 (软件名称,软件版本) 元组的列表。

使用示例
if __name__ == '__main__':
    installed_software_list = get_installed_software_list()
    if installed_software_list is None:
        print("无法获取已安装软件列表")
    else:
        print("已安装软件列表:")
        for software in installed_software_list:
            print("- %s (%s)" % software)

程序运行结果类似以下形式:

已安装软件列表:
- Python 3.8.2 (3.8.2150.0)
- PyCharm Community Edition 2020.3.3 (203.7148.72)
- Microsoft Visual C++ 2015-2019 Redistributable (x64) - 14.27.29016 (14.27.29016.0)
...
总结

通过以上代码实现,可以获取 Windows 操作系统中已安装的软件列表。值得注意的是,该列表仅包含注册表中的信息,可能会存在某些软件未被正确注册到该列表中的情况。同时,该程序只查询了 HKEY_LOCAL_MACHINE 分支下的注册表,而并未查询 HKEY_CURRENT_USER 分支下的注册表。如有需要,可以进一步扩展代码来实现该功能。