2

私の問題は http://my.safaribooksonline.com/0596007973/pythoncook2-CHP-10-SECT-17のシミュレートされた問題のようなもの で、2005 年の時代遅れの xpath メソッドを使用して、最終的に Python Cookbook、第 2 版に入りました。 10.6 のビルドイン python を使用することができませんでした (古いパッケージをインストールすることもできません)。

したい... 「Mac OS X システムに関する詳細情報を取得する」ために、system_profiler を使用して、コンピューターが起動するたびにスクリプトにまとめます (スクリプトはログイン時に起動します)。
私が収集している情報は、SW バージョンから HW 構成までさまざまです。

行の例は、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 に答える