如何快速获取使用python安装的所有软件的列表?

问题描述 投票:0回答:4

我想使用python在我的系统上安装软件列表。代码如下:

import wmi
w = wmi.WMI()
for p in w.Win32_Product():
    print r"\newcommand*{\Title}", "{" + p.Version +"}"
    print r"\newcommand*{\Title}", "{" + p.Vendor +"}"
    print r"\newcommand*{\Title}", "{" + p.Caption +"}"
    print("\hline")

现在,当我执行它时,我执行它之间的错误:

TypeError: cannot concatenate 'str' and 'NoneType' objects

所以在网上我搜索并得到这样的错误是当你试图连接一个字符串与无。所以,在我的代码中我做了以下更改来处理它:

import wmi
w = wmi.WMI()
print "hello"
for p in w.Win32_Product():
    print r"\newcommand*{\Title}", "{" + p.Version +"}"
    print r"\newcommand*{\Title}", "{" + p.Vendor +"}"
    if p.Caption == "NoneType":
        pass
    else:
        print r"\newcommand*{\Title}", "{" + p.Caption +"}"
    print("\hline")

但它仍然显示相同的错误。如何解决这样的错误?此外,我想知道是否有其他方法可以快速提供已安装软件的列表,因为我的代码需要很长时间才能使列表具有可用性。

python wmi
4个回答
3
投票
if p.Caption == "NoneType":

p.CaptionNone,所以它的类型是NoneType。你可以像这样检查None

if p.Caption is None:

或者在您的情况下,因为您要检查它是否不是None,反转条件:

if p.Caption is not None:
    print r"\newcommand*{\Title}", "{" + p.Caption +"}"

如果仍然显示相同的错误,那么它不是p.Caption什么是None而是p.Versionp.Vendor(或两者),所以如果这些属性不能保证包含值,那么也检查它们。

除此之外,如果您不关心其中包含“无”的输出,则使用比字符串连接更强大的字符串格式:

print r"\newcommand*{\Title}", "{%s}" % p.Caption

2
投票

你会发现这是python中常见的场景。

String连接A NoneType

你需要显式地转换为这样的字符串:

str(p.Version)

print r"\newcommand*{\Title}", "{" + str(p.Version) +"}"

您可以在此处阅读官方文档中有关str()方法的更多信息:str()

跳过NoneType因此不打印

if p.Caption is not None:
    print r"\newcommand*{\Title}", "{" + str(p.Caption) +"}"

0
投票
  1. 检查None的正确方法是if a is None:
  2. 你真的应该为此做一个功能,而不是生成如此糟糕的意大利面条代码。

0
投票

您应该了解format string syntax,它将为您处理此类型转换(并且可以更强大)。

import wmi

PATTERN = r"\newcommand*{{\Title}}{{{}}}"

w = wmi.WMI()
for p in w.Win32_Product():
    print PATTERN.format(p.Version)
    print PATTERN.format(p.Vendor)
    print PATTERN.format(p.Caption)
    print("\hline")

您可能还想将模式更改为r"\Title{{{}}}",因为对于此LaTeX输出(我假设)在每行重新定义Title命令而不打印任何内容是没有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.