我应该使用什么Python数据结构和解析器来处理Apple的system_profiler?

2 投票
1 回答
2017 浏览
提问于 2025-04-15 14:09

我的问题有点像一个模拟问题,来源于这个链接,最后被收录进了《Python Cookbook, 2nd Edition》。这个问题使用了一个2005年的过时的xpath方法,我在10.6的内置python上一直没法让它工作(也没法安装旧的包)。

我想要做的是... “获取关于Mac OS X系统的详细信息”,使用system_profiler每次电脑启动时在脚本中总结这些信息(这个脚本会在登录时启动)。
我收集的信息包括软件版本到硬件配置等。

一个示例命令是, system_profiler SPSoftwareDataType | grep 'Boot Volume', 这个命令会返回启动卷的名称。我还会调用15到20个其他命令来获取信息。

我尝试过将完整的'system_profiler > data'输出,然后用cat data | grep来解析,但这显然效率不高,甚至运行我上面那个示例命令的速度都更快。
输出到文件并用cat | grep需要18秒。

而单独调用每个命令只需要13秒。

*我想尽可能快。

我推测我可能需要创建一个字典,用键来引用数据,但我在想,解析和获取数据的最有效方法是什么?我在别的地方看到有人建议使用system_profiler输出到XML,然后用XML解析器,但我觉得可能有一些缓存和解析的方法比先输出到文件更有效。

1 个回答

7

使用系统自带的 system_profiler 命令时,可以加上 -xml 这个选项,这样输出的内容就会以标准的 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',
 ...

撰写回答