我想使用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")
但它仍然显示相同的错误。如何解决这样的错误?此外,我想知道是否有其他方法可以快速提供已安装软件的列表,因为我的代码需要很长时间才能使列表具有可用性。
if p.Caption == "NoneType":
p.Caption
是None
,所以它的类型是NoneType
。你可以像这样检查None
:
if p.Caption is None:
或者在您的情况下,因为您要检查它是否不是None
,反转条件:
if p.Caption is not None:
print r"\newcommand*{\Title}", "{" + p.Caption +"}"
如果仍然显示相同的错误,那么它不是p.Caption
什么是None
而是p.Version
或p.Vendor
(或两者),所以如果这些属性不能保证包含值,那么也检查它们。
除此之外,如果您不关心其中包含“无”的输出,则使用比字符串连接更强大的字符串格式:
print r"\newcommand*{\Title}", "{%s}" % p.Caption
你会发现这是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) +"}"
None
的正确方法是if a is None:
您应该了解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
命令而不打印任何内容是没有意义的。