在Python中获取所有已安装Windows程序的可靠方法?

11 投票
2 回答
10916 浏览
提问于 2025-04-15 18:05

我看到很多方法可以在WinXP及以上版本中用Python获取已安装程序的列表。那么,什么才是正确最可靠的方法呢?

目前,我是通过访问HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall来读取每个键,从中获取程序列表。(有人告诉我,这不是正确的方法)我也看到过使用WMI/Win32com来实现这个功能的例子,但有评论提到WMI在某些机器上可能会被关闭,所以这不是一个很可靠的解决方案。

有没有一种方法既正确可靠,可以获取已安装程序的列表?我看到的WMI例子在我的机器上都没法用(所以我不太想用它,我现在只在运行WinFLP,这是XP的简化版)。

我似乎还找到了一个TechNet的文章,里面有类似我问题的答案:http://gallery.technet.microsoft.com/ScriptCenter/en-us/154dcae0-57a1-4c6e-8f9f-b215904485b7。注意,Vista/7在平台下明确写着“不会工作”...所以WMI的方案似乎行不通...

能够获取已安装程序的路径也是一个好处,因为我现在的代码没有考虑到有人可能会在其他驱动器或非默认目录中安装程序。

2 个回答

3

WMI是查找已安装程序的正确方法,因为它可以在不同版本的操作系统上使用,并且将来也会得到支持。虽然查找特定的注册表键在某些版本的Windows上可能没问题,但将来不一定能保证有效。下面是一些简单的Python代码,用来检查Box Sync,我刚在Windows 7上试过。请注意,并不是每个产品的所有字段都会有值,所以有些地方可能会显示为'None'。

import wmi
w = wmi.WMI()
for p in w.Win32_Product():
    if 'Box, Inc.' == p.Vendor and p.Caption and 'Box Sync' in p.Caption:
        print 'Installed {}'.format(p.Version)

我发现WMI的一个缺点是启动速度非常慢。

8

你提到的那个脚本在Windows 7上运行得很好(使用的是32位的Python 2.5),我真的看不出它为什么会有问题。

其实,WMI这个方法的一个主要缺点是,它只会列出通过Windows安装程序安装的产品。所以它给出的列表并不完整。很多程序使用的是不同的安装程序。你可以对比一下通过(Select * from Win32_Product)得到的结果和控制面板上显示的内容。所以,除非你确定你感兴趣的程序是用MSI安装的,否则WMI肯定不是一个好的选择。

所以虽然这可能不是最“pythonic”的做法,但据我所知,最好的方法就是像你做的那样使用注册表。实际上,控制面板就是这样工作的,所以至少Windows认为这是最可靠的方法。

撰写回答