2013-03-05 1 views
1

파이썬 모듈을 바이트 코드로 디스 어셈블하는 방법을 실험하고 있습니다.어떻게 파이썬 모듈을 동적으로로드 및 언로드하고 디스 어셈블하고 검사하지만 초기화 코드를 실행하지 않거나 sys.modules에 추가하지 않습니까?

파이썬 모듈을 분해하거나 검사하기 위해 정적으로 또는 동적으로 가져 오기해야합니까? 그렇지 않다면, 그것을 수행하는 (pythonic, portable) 방법은 무엇입니까?

나는 싶습니다 런타임에 메모리에

  1. 로드 가능한 파이썬 모듈의 이진 데이터 :
    1. 을가 sys.modules에서 사용 가능한 모듈로 나타나는없이.
    2. 모듈의 __init__ 코드를 실행하거나 모든 네임 스페이스에 추가하고 싶지 않습니다.
    3. 모듈로드의 다른 부작용이 없어야합니다. 인터프리터에 관한 한, 검사 할 데이터의 얼룩이되어야합니다.
  2. 모듈의 클래스, 기능 또는 데이터를 분해하거나 검사하십시오.
  3. 원하는 경우 모듈을 언로드하십시오.

I가 검색 한, 난 (sys.modules에로 모듈 __init__ 코드 또는 다른 인라인 코드, 삽입을 수행하는 부작용을 갖는다) 동적 모듈 수입의 메소드를 참조. 그러나 나는 그 부작용을 다루지 않을 것입니다.

이것이 가능합니까? 그렇다면 어떤 접근 방식이 가장 휴대용/Pythonic입니까?

+0

어떤 것 __init__.py 파일을 실행하지 않고 "모듈을로드"한다는 의미입니까? 그것은 내게 모순처럼 보입니다. –

+0

코드로 액세스 할 수 있지만 실행되지 않는 형식으로 이진 데이터를 메모리에로드하십시오. 귀하의 의견을 반영하도록 질문을 업데이트했습니다. – Inactivist

답변

1

나는 이것을 약간 짚어 보았다. 가능한 해결책은 pyclbr 모듈을 사용하는 것이다. 검사는 클래스와 함수에 대한 기본 정보를 찾고 쉽게 액세스 할 수 있도록 사전에로드합니다.

>>> import pyclbr 
>>> import sys 
>>> info = pyclbr.readmodule_ex('inspect') 
>>> info 
{'formatargvalues': <pyclbr.Function object at 0x5083e28e50>, 'walktree': <pyclbr.Function object at 0x5083e28b50>, 'getinnerframes': <pyclbr.Function object at 0x5083e29050>, 'indentsize': <pyclbr.Function object at 0x5083e28710>, 'getmodulename': <pyclbr.Function object at 0x5083e28850>, 'formatannotation': <pyclbr.Function object at 0x5083e28d50>, 'ismemberdescriptor': <pyclbr.Function object at 0x5083e283d0>, 'iscode': <pyclbr.Function object at 0x5083e28550>, 'getsource': <pyclbr.Function object at 0x5083e28b10>, 'formatargspec': <pyclbr.Function object at 0x5083e28dd0>, 'getabsfile': <pyclbr.Function object at 0x5083e288d0>, 'getsourcelines': <pyclbr.Function object at 0x5083e28ad0>, '_getfullargs': <pyclbr.Function object at 0x5083e28c10>, 'isabstract': <pyclbr.Function object at 0x5083e28610>, 'isbuiltin': <pyclbr.Function object at 0x5083e28590>, 'getlineno': <pyclbr.Function object at 0x5083e28f10>, 'getcomments': <pyclbr.Function object at 0x5083e28990>, 'getgeneratorstate': <pyclbr.Function object at 0x5083e293d0>, 'getattr_static': <pyclbr.Function object at 0x5083e29390>, 'getframeinfo': <pyclbr.Function object at 0x5083e28ed0>, 'isgenerator': <pyclbr.Function object at 0x5083e28490>, '_static_getmro': <pyclbr.Function object at 0x5083e29190>, 'isframe': <pyclbr.Function object at 0x5083e28510>, 'getouterframes': <pyclbr.Function object at 0x5083e28f90>, 'getclasstree': <pyclbr.Function object at 0x5083e28b90>, 'getfile': <pyclbr.Function object at 0x5083e287d0>, '_shadowed_dict': <pyclbr.Function object at 0x5083e29310>, 'getargvalues': <pyclbr.Function object at 0x5083e28d10>, 'getmembers': <pyclbr.Function object at 0x5083e28650>, 'BlockFinder': <pyclbr.Class object at 0x5083e28a10>, 'isfunction': <pyclbr.Function object at 0x5083e28390>, 'getargspec': <pyclbr.Function object at 0x5083e28c50>, 'currentframe': <pyclbr.Function object at 0x5083e29090>, 'namedtuple': <pyclbr.Function object at 0x5083e1b150>, 'getmoduleinfo': <pyclbr.Function object at 0x5083e28810>, 'trace': <pyclbr.Function object at 0x5083e29110>, 'isclass': <pyclbr.Function object at 0x5083db8950>, '_is_type': <pyclbr.Function object at 0x5083e29290>, 'getcallargs': <pyclbr.Function object at 0x5083e28e90>, 'ismethoddescriptor': <pyclbr.Function object at 0x5083e28310>, 'isgeneratorfunction': <pyclbr.Function object at 0x5083e28450>, 'isroutine': <pyclbr.Function object at 0x5083e285d0>, 'getfullargspec': <pyclbr.Function object at 0x5083e28cd0>, 'getmro': <pyclbr.Function object at 0x5083e286d0>, 'getargs': <pyclbr.Function object at 0x5083e28bd0>, 'stack': <pyclbr.Function object at 0x5083e290d0>, 'getdoc': <pyclbr.Function object at 0x5083e28750>, 'findsource': <pyclbr.Function object at 0x5083e28950>, 'cleandoc': <pyclbr.Function object at 0x5083e28790>, '_check_class': <pyclbr.Function object at 0x5083e29250>, '_check_instance': <pyclbr.Function object at 0x5083e29210>, 'classify_class_attrs': <pyclbr.Function object at 0x5083e28690>, 'ismodule': <pyclbr.Function object at 0x5083db8910>, 'EndOfBlock': <pyclbr.Class object at 0x5083e289d0>, 'isdatadescriptor': <pyclbr.Function object at 0x5083e28350>, 'getmodule': <pyclbr.Function object at 0x5083e28910>, 'formatannotationrelativeto': <pyclbr.Function object at 0x5083e28d90>, 'getsourcefile': <pyclbr.Function object at 0x5083e28890>, 'ismethod': <pyclbr.Function object at 0x5083e282d0>, 'isgetsetdescriptor': <pyclbr.Function object at 0x5083e28410>, 'istraceback': <pyclbr.Function object at 0x5083e284d0>, 'getblock': <pyclbr.Function object at 0x5083e28a50>} 
>>> sys.modules['inspect'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'inspect' 

아무것도 고급 당신은 ast module을 통해 추상 구문 트리를 액세스로 찾기 시작해야 할 것입니다 : 다음은 샘플 실행이다.

+0

클래스 브라우저 기능이 필요하지만 노출 된 인터페이스가 핵심 요구 사항에 도움이되지 않아 도움이됩니다. 구현이 추가적인 단서를 제공하는지 확인하기 위해 pyclbr로 코드를 작성합니다. – Inactivist

+0

@Inactivist 요구 사항을 조금 더 확장 할 수 있습니까? 어떤 종류의 분석을 기대하십니까? 더 낮은 수준의 상호 작용 대부분은 [Python Language Services] (http://docs.python.org/2/library/language.html) 모듈에 의해 처리됩니다. – cwgem

+0

주로 런타임시 모듈의 메소드 (및 다른 속성)에서 바이트 코드 데이터를 가져 오려고하지만 실행을 위해 모듈을 가져오고 싶지 않습니다. 기본 제공 서비스는 모듈을 가져오고 싶거나 가져 왔다고 가정합니다 (그러나 여전히 검색하고 배우고 있습니다.) 명확하게 설명하기 위해 원래 질문을 업데이트했습니다. – Inactivist

관련 문제