2

我的问题类似于来自 http://my.safaribooksonline.com/0596007973/pythoncook2-CHP-10-SECT-17的模拟问题, 它最终使用 2005 年过时的 xpath 方法进入 Python Cookbook,第二版,我无法使用 10.6 的内置 python(也无法安装较旧的软件包)

我想...“检索有关 Mac OS X 系统的详细信息”,每次计算机启动时使用 system_profiler 在脚本中对其进行总结(该脚本将在登录时启动)。
我收集的信息因软件版本和硬件配置而异。

例如,system_profiler SPSoftwareDataType | grep 'Boot Volume' 返回启动卷名。我打了 15 到 20 次其他电话询问信息。

我尝试输出完整的“system_profiler > data”并使用 cat data | 解析它。grep,但这显然效率低下,如果我像上面的示例那样运行每一行,它会更快。
如果输出到文件和 cat | 18 秒 grep。

13 秒(如果拨打个人电话)

*我试图让它尽可能快。

我推断我可能需要创建一个字典并使用键来引用数据,但我想知道解析和检索数据的最有效方法是什么?我在其他地方看到了使用 system_profiler 输出到 XML 并使用 XML 解析器的建议,但我认为可能有一些缓存和解析方法比首先输出到文件更有效。

4

1 回答 1

7

使用 -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',
 ...
于 2009-09-08T08:30:58.427 回答