2015-12-08 2 views
0

Я хочу иметь список программного обеспечения, установленного в моей системе, с помощью python. Код выглядит следующим образом:Как быстро получить список всех программ, установленных с помощью 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 

Так на сети я искал и получил, что такая ошибка, когда вы пытаясь объединить строку с чем-то, что есть None. поэтому в моем коде я сделал следующее изменение, чтобы иметь дело с этим:

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

Является ли этот выход LaTeX? Зачем переопределять команду '\ Title' в каждой строке? Почему бы не использовать 'print r '\ Title {" + p.XXX + "}" '? –

ответ

2

Вы найдете это распространенный сценарий в python.

Строка сочленения NoneType

Вы должны явно привести в строку, как это:

str(p.Version)

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

Вы можете прочитать больше о методе ул() в официальные документы здесь: str()

Пропуск NoneType Так его не Printed

if p.Caption is not None: 
    print r"\newcommand*{\Title}", "{" + str(p.Caption) +"}" 
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 (или оба), поэтому, если эти свойства не гарантируют, что они содержат значение, то также проверьте их.

альтернатива, что, если вы не все равно, что есть выход с «None» в нем, заключается в использовании строки форматирования, который является более мощным, чем конкатенации:

print r"\newcommand*{\Title}", "{%s}" % p.Caption 
0
  1. Правильный способ проверить для None is if a is None:
  2. Вы действительно должны сделать функцию для этого и не генерировать столь ужасный код спагетти.
+0

Я считаю, что ваш второй вопрос - это вопрос или предпочтение. Я вряд ли рассмотрю одно условие, если/else будет генерировать «ужасный код спагетти» :) – Dan

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 команду в каждой строке без печати ничего.

Смежные вопросы