Какую структуру данных и синтаксический анализатор Python я должен использовать с Apple system_profiler?

Моя проблема похожа на проблему, смоделированную на http://my.safaribooksonline.com/0596007973/pythoncook2-CHP-10-SECT-17 которая в конечном итоге попала в Python Cookbook, 2nd Edition, с использованием устаревшего метода xpath 2005 года, который я не смог приступить к работе со встроенным питоном 10.6 (и не устанавливал старые пакеты)

Я хочу... "получить подробную информацию о системе Mac OS X", используя system_profiler, чтобы суммировать ее в сценарии при каждом запуске компьютера (сценарий запускается при входе в систему).
Информация, которую я собираю, варьируется от версии SW до конфигурации HW.

Пример строки: system_profiler SPSoftwareDataType | grep 'Boot Volume', который возвращает имя загрузочного тома. Я делаю 15-20 других запросов информации.

Я попытался вывести полный 'system_profiler > data' и проанализировать это, используя данные cat | grep, но это явно неэффективно до такой степени, что было бы быстрее, если бы я просто запускал каждую строку, как в моем примере выше.
18 секунд, если выход в файл и кошка | Grep.

13 секунд при совершении индивидуальных звонков

* Я пытаюсь сделать это как можно быстрее.

Я пришел к выводу, что мне, вероятно, нужно создать словарь и использовать ключи для ссылки на данные, но мне интересно, каков наиболее эффективный для меня способ анализа и извлечения данных? В другом месте я видел предложение использовать system_profiler для вывода в XML и использовать синтаксический анализатор XML, но я думаю, что, возможно, есть какой-то метод кэширования и анализа, который делает это более эффективно, чем сначала вывод в файл.

1 ответ

Используйте опцию -xml для system_profiler чтобы отформатировать вывод в стандартном формате OS X plist, затем используйте встроенный в Python plistlib для анализа соответствующей структуры данных, которую вы можете проанализировать. Простой пример:

>>> from subprocess import Popen, PIPE
>>> from plistlib import readPlistFromString
>>> from pprint import pprint
>>> sp = Popen(["system_profiler", "-xml"], stdout=PIPE).communicate()[0]
>>> pprint(readPlistFromString(sp))
[{'_dataType': 'SPHardwareDataType',
  '_detailLevel': '-2',
  '_items': [{'SMC_version_system': '1.21f4',
              '_name': 'hardware_overview',
              'boot_rom_version': 'IM71.007A.B03',
              'bus_speed': '800 MHz',
              'cpu_type': 'Intel Core 2 Duo',
 ...
Другие вопросы по тегам