모듈 자체 내부의 모듈에 대한 참조를 얻는 방법은 무엇입니까?


158

해당 모듈 내에서 모듈에 대한 참조를 얻으려면 어떻게해야합니까? 또한 해당 모듈이 포함 된 패키지에 대한 참조를 얻는 방법은 무엇입니까?


7
모듈 범위에 변수 (예 : 함수 또는 클래스 외부의 BLAH = 10)가 있고 BLAH라는 클래스 / 함수 변수가 있고 차별화하려고하기 때문에이 질문을하고 있다고 생각합니다 . 유효한 질문은 다음과 같습니다. 이것이 필요합니까? 스코프 규칙은 실수를 저지르는 경향이 있으며, 특히 6 개월 후 코드를 선택하는 '바보'에 의해 실수가 발생합니다. 이와 같은 트릭은 거의 필요하지 않습니다. 나는 그들이 종종 혼란스럽고 나중에 잘못 수정되기 때문에 완전히 피하려고합니다.
케빈 J. 라이스

2
@ KevinJ.Rice "6 개월 후 (즉, 6 개월 후) 코드를 가져 오는 '바보'"가 저의 하루를 보냈습니다!
arctelix

8
그가 왜 질문을 하는가? 이 작업을 수행해야하는 충분한 이유가 있습니다.
Christopher Barber

닫아야합니다. 너무 유용합니다.
mlvljr

답변:


211
import sys
current_module = sys.modules[__name__]

3
단, 모듈을 다시로드하면 이것이 정확하지 않습니다. 참조가 유지되는 곳이 없다고 생각합니다.있는 경우 리로드가 실제로 작동하지 않을 것입니다.
Dima Tisnek

14
다시로드하면 동일한 모듈 객체가 재사용됩니다. 새로운 모듈 객체가 생성되지 않으므로 다시로드 할 때도 여전히 정확합니다.
bukzor

18

sys 모듈을 가져 오지 않고 논란의 여지가 있지만-취향에 따라 다른 기술이 더 간단합니다.

current_module = __import__(__name__)

가져 오기가 없습니다. 파이썬은 각 모듈을 한 번만 가져옵니다.


이것은 sys 가져 오기를 피하는 정말 좋은 방법 인 것 같습니다. 읽기에 반 직관적이지 않은 것 외에이 접근법에 대한 잠재적 인 단점이 있습니까?
JeremyDouglass

@JeremyDouglass. 내가 아는 것은 아닙니다. import 는 합법적이고 문서화 된 내장 함수 (유일한 xx 함수)입니다. 'importlib'패키지로 바꿀 수 있습니다 (가져와야 함). sys.path에서 같은 이름의 모듈을 사용할 수있는 경우 상대 / 절대 가져 오기에 문제가있을 수 있습니다.이 경우 함수의 'level'인수로 해결할 수 있습니다.
Uri

16

해당 모듈에 __module__클래스가있는 경우 클래스 의 속성은 클래스의 모듈 이름입니다. 따라서를 통해 모듈에 액세스 할 수 있습니다 sys.modules[klass.__module__]. 이것은 기능에도 적용됩니다.


4
실제로 함수의 경우 __module__속성이 모듈이 아니라 문자열 인 것 같습니다. 따라서 inspect.getabsfile(func.__module__)" TypeError : 'os'는 모듈, 클래스, 메소드, 함수, 트레이스 백, 프레임 또는 코드 객체가 아닙니다 "와 함께 실패합니다 . 동안은 inspect.getabsfile(sys.modules[o.__module__])통과 것으로 보인다.
sdaau

12

다음을 사용하여 현재 모듈의 이름을 얻을 수 있습니다 __name__

모듈 참조는 sys.modules사전 에서 찾을 수 있습니다 .

파이썬 문서를 참조하십시오


1

외부에서 전달할 수 있습니다.

mymod.init(mymod)

이상적이지는 않지만 현재 사용 사례에 적합합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.