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

时间:2010-01-16 15:45:11

标签: python windows registry wmi win32com

我已经在python中看到了在WinXP +上检索已安装程序的多种方法。什么是正确的最强大的方式?

目前我正在访问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 个答案:

答案 0 :(得分:8)

你所指的technet脚本在Win 7(使用Python 2.5 32bits)下完美运行,我真的不明白它为什么不应该。

实际上,WMI方法的真正弱点是它只列出了通过Windows Installer安装的产品。所以它不会给你完整的清单。许多程序使用不同的安装程序。只需比较(Select * from Win32_Product)和控制面板中显示的结果。因此,除非您确定您的列表中的程序是使用MSI安装的,否则WMI肯定不是答案。

所以它可能不是非常pythonic,但据我所知,最好的方法是使用注册表。这实际上是控制面板的工作方式,因此至少Windows认为它是最强大的方法。

答案 1 :(得分:3)

WMI是查找已安装程序的正确方法,因为它可以在不同版本的操作系统中运行,并且将得到支持。寻找特定的regkeys可能适用于特定版本的Windows,但不保证将来可以使用。下面是一些简单的python代码,用于检查我刚刚在Windows 7上尝试过的Box Sync。请注意,并非所有字段都可用于每个产品,因此请注意这些字段为“无”。'

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看到的缺点是启动速度很慢。

相关问题