我想使用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")
但它仍显示相同的错误。如何解决这样的错误? 此外,我想知道是否有其他方法可以快速获得已安装软件的列表,因为我的代码需要很长时间才能使列表具有可用性。
答案 0 :(得分:3)
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
答案 1 :(得分:2)
你会发现这是python中常见的场景。
字符串连接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) +"}"
答案 2 :(得分:0)
None
的正确方法是if a is None:
答案 3 :(得分: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
命令而不打印任何内容是没有意义的。