2010-02-22 3 views
12

모듈에 대한 코드 개체가 있다고 가정하면 해당 모듈 개체를 어떻게 구할 수 있습니까?Python 코드 개체에서 모듈 개체를 생성하는 방법

moduleNames = {}; exec code in moduleNames은 내가 원하는 것에 매우 근접합니다. 모듈에 선언 된 전역 변수를 사전으로 반환합니다. 하지만 실제 모듈 객체를 원한다면 어떻게해야합니까?

편집 : 자신의 모듈 개체를 굴릴 수있는 것처럼 보입니다. 모듈 형 편리하게 문서화되어 있지 않습니다,하지만 당신은 다음과 같이 할 수 있습니다 : 오늘의 파이썬에 내장되어 이름을하지 않는 유형의 인스턴스를 선호하는 방법을 코멘트가 이미 표시로

import sys 
module = sys.__class__ 
del sys 
foo = module('foo', 'Doc string') 
foo.__file__ = 'foo.pyc' 
exec code in foo.__dict__ 
+0

선호 액세스 파이썬 3에서 제거 모듈 타입의 포인트는'types.ModuleType'입니다. –

답변

19

을,

:이 하지 자동 sys.modules에서 새 모듈을 삽입한다는 것을

>>> import types 
>>> m = types.ModuleType('m', 'The m module') 

참고 : 표준 라이브러리에서 types 모듈을 통해 얻은 유형을 호출 당신이 수동으로 수행해야하는 작업이다

: 모듈의 코드 객체는 일반적으로 모듈의 추가 sys.modules에이 후 실행 이후

>>> sys.modules['m'] = m 
>>> sys.modules['m'] 
<module 'm' (built-in)> 

이것은 중요 할 수는 - 예를 들어,은 완벽하게 맞습니다 코드가 sys.modules[__name__]을 나타내며이 단계를 잊어 버리면 (KeyError) 실패합니다. ,이 단계, 당신은 이미 편집에 가지고 m.__file__을 설정 한 후

>>> code = compile("a=23", "m.py", "exec") 
>>> exec code in m.__dict__ 
>>> m.a 
23 

(또는 파이썬 3는 물론, 사용중인 경우 exec는 기능입니다 파이썬 3 동등한 -) 올바른지 (물론, 문자열을 컴파일하는 것보다 일반적으로 코드 객체를 미묘한 방법으로 얻었지만 질문에는 중요하지 않습니다 .-).

당신은 시작에서 새 모듈 개체를 만드는 대신 types 모듈의 new 모듈을 사용했을 파이썬의 이전 버전에서

하지만 new 파이썬 2.6 이후 사용되지 않으며

관련 문제