sys.modules
와 sys.path
의 차이점은 무엇일까?sys.modules
sys.modules
에서 찾을 수 없다.sys.path
['',
'/Users/song-eun-u/anaconda3/bin',
'/Users/song-eun-u/anaconda3/lib/python36.zip',
'/Users/song-eun-u/anaconda3/lib/python3.6',
'/Users/song-eun-u/anaconda3/lib/python3.6/lib-dynload',
'/Users/song-eun-u/anaconda3/lib/python3.6/site-packages',
'/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/aeosa',
'/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/IPython/extensions',
'/Users/song-eun-u/.ipython']
1) sys
는 파이썬에 포함된 모듈이다. 그러므로 sys
모듈을 import 해서 sys.module
과 sys.path
를 출력, 수정할 수 있다.
import sys
print(sys.path)
print(sys.modules)
2) 파이썬은 import 하고자 하는 모듈과 package를 찾을 때에 먼저 sys.modules를 보고, 없으면 파이썬 built-in 모듈들을 확인하고 마지막으로 sys.path에 지정되어 있는 경로들을 확인해서 찾는다.
3) sys.path에서도 못 찾으면 ModuleNotFoundError 에러를 리턴한다.
우선 calculator 패키지를 만들고 main.py에서 add_andmutiply를 임포트 하면 해당 에러가 발생한다.
상위 패키지를 알 수 없는 상대를 가져오려는 시도를 했다고 한다.
공식 문서를 보면 아래와 같은 문구가 있다.
< Since the name of the main module is always "main", modules intended for use as the main module of a Python application must always use absolute imports. >
main 모듈은 항상__main__
이고, 메인 모듈에서는 항상 절대경로를 사용해야 한다고 한다.
절대경로로 바꿔서 돌려보면 정상적으로 출력되는 걸 확인할 수 있다.
add_and_multiply.py는 패키지 안에 있는 모듈이라서 절대경로와 상대경로가 모두 정상적으로 출력된다.
하지만 main.py는 패키지 안에 속하지 않았으므로 상대경로는 실행이 안 되며 절대경로만 실행할 수 있다.
__init__.py
파일의 역할은?__init__.py
는 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다.
python3.3 이전 버전은 패키지에 포함된 디렉터리에 __init__.py
파일이 없다면 패키지로 인식을 하지 않는다고 한다.
(python3.3이후로는 없어도 패키지로 인식한다_PEP420)