2009-09-08 2 views
1

내 문제는 http://my.safaribooksonline.com/0596007973/pythoncook2-CHP-10-SECT-17 에서 시뮬레이션 된 문제와 같습니다. 2005 년의 구식 xpath 메소드를 사용하여 결국 Python Cookbook, 2nd Edition으로 바뀌 었습니다. 10.6의 빌드 인에서 작동하지 못했습니다. Python (이전 패키지를 설치하지 않음)파이썬 데이터 구조와 구문 분석기를 Apple의 system_profiler와 함께 사용해야합니까?

나는 Mac OS X 시스템에 대한 자세한 정보를 얻으 려합니다. system_profiler를 사용하여 컴퓨터가 시작될 때마다 스크립트에서이를 요약합니다 (로그인시 스크립트가 시작됩니다) .
내가 수집하는 정보는 SW 버전에서 HW 구성까지 다양합니다.

예제 행은 다음과 같습니다. system_profiler SPSoftwareDataType | grep 'Boot Volume' 시작 볼륨 이름을 반환합니다. 나는 정보를 얻기 위해 15-20 개의 다른 전화를한다.

전체 'system_profiler> 데이터'를 출력하고 cat 데이터를 사용하여 구문 분석을 시도했습니다. grep하지만 위의 예제와 같이 각 행을 실행하면 속도가 더 빨라지는 것은 분명히 비효율적입니다.
파일과 고양이를 출력 할 경우 18 초 | grep.

13초 나는 가능한 한 빨리 그것을 만들려고 * 개별 전화

을 만드는 경우.

나는 사전을 만들고 데이터를 참조하기 위해 키를 사용할 필요가 있다고 추론하지만 데이터를 구문 분석하고 검색하는 가장 효율적인 방법이 무엇인지 궁금합니다. XML로 출력하고 XML 파서를 사용하기 위해 system_profiler를 사용하는 다른 곳에서 제안을 보았습니다.하지만 아마도 파일로 출력하는 것보다 효율적으로 수행하는 캐시 및 구문 분석 메소드가있을 것입니다.

답변

6

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', 
... 
+0

감사합니다. –

관련 문제