2009-11-04 3 views
111

해당 모듈 내에서 모듈에 대한 참조를 얻으려면 어떻게합니까? 또한 해당 모듈을 포함하는 패키지에 대한 참조를 얻으려면 어떻게합니까?Python : 모듈 자체의 모듈에 대한 참조를 얻으려면 어떻게해야합니까?

+5

** 모듈 범위 ** (예 : 함수 또는 클래스 외부의 BLAH = 10)에 변수가 있고 BLAH라는 클래스/함수 변수 ** 및 변수가 있기 때문에이 질문을하는 것 같습니다. 당신은 차별화되기를 원합니다. 여기서 유효한 질문은 다음과 같습니다. ** 필수 사항입니까? ** 스코프 규칙은 실수로 악명이 날 정도로 악명이 높습니다. 특히 6 개월 후에 코드를 사용하는 '바보'가 특히 그렇습니다. 이런 트릭은 거의 필요하지 않습니다. 나는 종종 혼란스럽고 나중에 잘못 수정되기 때문에 완전히 피하려고합니다. –

+1

@ KevinJ.Rice "당신 (6 개월 후, 당신의 코드)을 선택하는 '바보'가 내 하루를 보냈습니다! – arctelix

+4

왜 그가 질문을하는 데 관심이 있습니까? 이 작업을 수행하는 데 필요한 충분한 이유가 있습니다. 모듈을 다시로드하면 –

답변

165
import sys 
current_module = sys.modules[__name__] 
+3

을 제외하고는 정확하지 않습니다. 참조가 유지되도록 보장되는 곳이 없다고 생각합니다. 다시로드하면 실제로 작동하지 않을 것입니다. 맞습니까? –

+10

다시로드하면 동일한 모듈 객체가 다시 사용됩니다. 새로운 모듈 객체는 생성되지 않으므로 다시로드 할 때 여전히 올바르다. – bukzor

14

해당 모듈에 클래스가있는 경우 클래스의 __module__ 속성은 클래스의 모듈 이름입니다. 따라서 sys.modules[klass.__module__]을 통해 모듈에 액세스 할 수 있습니다. 이것은 함수에서도 작동합니다.

+4

사실, (적어도) 함수의 경우, '__module__' 속성은 모듈이 아니라 문자열로 보입니다. 따라서 'inspect.getabsfile (func .__ module __)'은 "_TypeError :'가 모듈, 클래스, 메소드, 함수, 역 추적, 프레임 또는 코드 객체가 아닌 _"으로 실패합니다. "; 'inspect.getabsfile (sys.modules [o .__ module __])'이 통과하는 것처럼 보입니다. – sdaau

+0

고마워요, 고쳐주세요. – Michael

8

당신은 sys.modules 사전에서 찾을 수 있습니다 __name__

모듈 참조를 사용하여 현재 모듈의 이름을 얻을 수 있습니다.

current_module = __import__(__name__) 

하는 것이 더 수입이없는주의 : - 당신의 취향에 따라 달라집니다 - 간단

파이썬에게 틀림없이 sys 모듈을 가져올하지 않습니다 documentation

+3

문서 링크에 감사드립니다. –

3

또 하나 개의 기술을 참조하십시오. 파이썬은 각 모듈을 한 번만 가져옵니다.

mymod.init(mymod) 

적합하지하지만 내 현재 사용-경우에 작동합니다

+0

이것은 sys를 가져 오는 것을 피하는 정말 좋은 방법입니다. 이 접근법에 잠재적 인 단점이 있습니까? – JeremyDouglass

+0

@JeremyDouglass. 내가 아는 것은 아닙니다. __import__는 합법적이고 문서화 된 내장 함수입니다 (유일한 __xx__ 함수). 'importlib'패키지로 대체 할 수 있습니다 (가져와야합니다). 어쩌면 - 절대로 나에게 일어난 일이 아니다 - 같은 이름을 가진 모듈이 sys.path에서 사용 가능하다면 상대/절대 가져 오기와 관련된 문제가 발생할 수있다.이 경우 함수의 'level'인수로 해결할 수있다. – Uri

1

당신은 외부에서 그것을에 전달할 수 있습니다.

관련 문제