모듈, 패키지를 찾는 순서
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 : 파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다.