오늘은 파이썬에서 모듈이나 패키지가 어떻게 참조가 되는지 알아보겠습니다.
현재 시스템 구동 상황에서 import되어있는 module과 package를 딕셔너리형태로 담고 있다.
import할 때 가장처음 확인 하며 import 중복을 막는다.
패키지들이 담겨있는 경로를 list 형태로 가지고 있다.
ModuleNotFoundE
if 모듈이 sys.modules에 정의됨? :
pass
elif 파이썬 build-in 모듈임?:
sys.modules에 추가
elif sys.path에 있음?:
sys,modules에 추가
else:
error('ModuleNotFoundError')
다음과 같은 구조의 패키지를 만들어보자
이대로 main.py를 돌리면 다음과 같은 에러가 나온다.
공식문서를 보면 메인으로 사용하는 모듈에서는 모듈의 이름(__name__
)이 항상 __main__
이기 떄문에 절대경로
로 참조하여야한다고 나와있다.
__name__
을 보고 상대경로의 기준을 잡아야하는데 __main__
이라고 덜렁 되어있으니까 interpretor에서 찾지 못하는 것 같다. ****
이는 메인모듈은 항상 최상위 디렉토리에 두어야한다는 말과 같은 말인 것 같다.
__init__.py
은 존재만으로 해당 디렉토리가 패키지임을 알려주는 역할을 합니다.
# __init__.py
from .mod1 import func2
from .mod2 import func3
__all__ = ['func2', 'func3']
# main.py
from pkg import *
func2()
func3()
func4() ## <== Error. func4 함수는 __all__ 에 정의되지 않았으므로 import 될 수 없음.
부가적으로 노출을 원하지 않는 함수가 외부에 import 되어 사용되는 것을 막을 수 있습니다.