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']
** 파이썬은 list의 각 경로를 하나 하나 확인하면서 해당 경로에 import 하고자 하는 package가 위치해 있는지 확인한다.
sys는 파이썬에 포함되어 있는 모듈이므로 sys모듈을 import해서 sys.modules와 sys.path를 출력할 수도 있고 수정할 수 도 있다.
built-in modules
Q. 그렇다면 파이썬은 모듈/package를 어떻게 찾을까? 위의 설명한 3가지 장소를 순서대로 보면서 찾습니다.
sys.modules -> built-in modules -> sys.path
Q. 마지막 sys.path에서도 못찾게 된다면 어떻게 되는가?
sys.path에서도 못찾으면 ModuleNotFoundError 에러를 리턴합니다.
내장 모듈
이고 파이썬 설치시 기본적으로 내장 모듈에 대한 path정보가 default 값으로 지정
되어있다.built-in 모듈중 하나
이므로 경로 검색순서에 따라 쉽게 찾을 수 있다.직접 개발한 local package를 import할때는 해당 package의 위치에 맞게 import 경로를 잘 선언해야 한다. local package를 import하는 경로에는 두가지가 있다.
Absolute path
my_app => package2 => subpackage1 => module5.py
relative path
오류:
Traceback (most recent call last):
File "c:\Users\PC\Downloads\calculator\main.py", line 5, in <module>
from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package
import에러로 알려지지 않은 부모패키지를 relative import했기 때문이다.
그래서 아래와 같이 절대경로로 바꿔주어야 한다.
# absoulte path
from calculator.add_and_multiply import add_and_multiply
기본 모듈은 다른 패키지나 모듈을 불러올때 절대경로로 불러와야 한다.
그리고 기본 모듈이 아닌경우는 절대경로든 상대경로든 상관이 없이 불러오면 된다!
사실 이부분이 왜 그렇게 되는지 이유를 정확히 모르겠다...ㅠㅠㅠ
공부를 계속 하면서 내용을 추가적으로 찾아봐야겠다.
__init__.py
파일의 역할에 대해서도 정리__init__.py
파일을 만들어 사용한다. __init__.py
파일이 무조건 있어야 패키지로 작동했다. 그러나 이후 버전부터는 __init__.py
파일이 없어도 폴더 내부에 파이썬 파일이 들어 있기만 하면 패키지로 작동한다.