현재 모듈이 "top level scripting environment"__main__
인 경우에도 함수의 실제 현재 모듈을 가져 오려고합니다 (다른 곳에서 가져온 경우).Python : 현재 모듈을 확인하십시오 (__main__이 아님)
이상하게 들릴지 모르겠지만, 배경은 기능을 직렬화하고 다른 컴퓨터에서 (인수를 포함하여) 직렬화를 해제해야하는데 올바른 모듈인지 확인해야합니다. __main__
deserialize하기 전에 가져옵니다 (그렇지 않으면 AttributeError: 'module' object has no attribute my_fun
이라는 오류가 발생합니다).
지금까지, 나는 inspection을 시도했다 :
import inspect
print inspect.getmodule(my_fun)
나에게 물론
<module '__main__' from 'example.py'>
을 제공한다. 나는 또한 globals()
, 행운을 사용하여 유용한 것을 찾는 시도했다.
내가 정말로 원하는 것은 <module 'example' from 'example.py'>
입니다. 나는 해키 방법은
m_name = __main__.__file__.split("/")[-1].replace(".pyc","")
같은 것을 사용하여 파일 이름에서 구문 분석 한 후 이름 sys.modules[m_name]
으로 모듈을 찾을 수있을 것 같아요.
더 깨끗한/더 좋은 방법이 있나요?
편집 : ipython의 "FakeModule"과 좀 더 인터넷 검색에 대한 학습 후, 나는 내가 명시 적으로 현재 모듈을 가져 오는 것이 나의 현재 솔루션 (포함 직면하고있어 정확하게 문제를 설명하는 this post 건너 온 import current_module
및 my_fun 대신 current_module.my_fun
을 직렬화). 내 패키지 사용자에게는 직관적이지 않을 수도 있으므로이 문제를 피하려고합니다.
'nose' 라이브러리의 내부, 특히'importer' 모듈을 살펴 보셨습니까? '코 (nose) '는 이것과 매우 유사한 것들을하기 때문에 영감을 찾는 좋은 장소 일 수 있습니다. –