
모듈, 패키지를 찾는 순서
1. sys.modules
2. built-in modules
3. sys.path
1)sys.modules은 모듈과 패키지를 찾을때 가장 먼저 확인하지만 sys.path는 가장 마지막에 확인한다.
2)sys.modules은 dictionary이나 sys.path는
기본적으로 list이며 string 요소들을 가지고 있는 list 입니다.
sys 모듈 또한 파이썬에 내장되어 있는 모듈이기에 2번째 찾는 단계인
built-in modules로 찾을수 있다.
1)Absolute path 절대경로
import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하다. -최상단 디렉토리 기준으로 한다-

가장 아래 있는 module5.py 찾는 경로는 아래 코드와 같다.
my_app.package2.subpackage1.module5.py
2)Relative path 상대경로
최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 정한다.
ex) package2의 module3에서 package2의 class1과 package2의 하위 package인 subpackage1의 module5의 function2 함수를 import 하려고 하면 다음 처럼 할 수 있습니다.
# package2/module3.py
from . import class1
from .subpackage1.module5 import function2
dot .은 import 가 선언되는 파일의 현재 위치를 이야기한다.
또한 .2개를 사용하는데 dot 2개 .. 는 현재위치에서 상위 디렉토리로 가는 경로를 나타낸다.
# subpackage1/module5.py
from ..module4 import class4
결론
Relative path는 경로의 길이가 짧지만 헷갈리기 쉽고 파일위치 변경 시 경로위치도 함께 변경해야 하니까
그냥Relative path방법을 사용하자
ImportError: attempted relative import with no known parent package
상대경로가 아닌 절대경로로 바꿔줌으로 써 오류를 해결할 수 있었다. 위 코드를 보면 from뒤에 dot(.)이 있음으로 상대경로인 것을 알 수 있다.
절대경로로 할시 아래와 같은 에러가 발생한다.
ModuleNotFoundError: No module named 'calculator'
현재 디렉토리가 이미calculator 절대경로 상이 올바르지않은거같아서 수정하였더니 '5'라는 숫자가 잘 출력되었다.
#위에서 아래와 같이 수정하였다.
from calculator.multiplication import multiply
-----------------------------------------------
from multiplication import multiply
__init__.py 파일의 역할init.py : 파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다.