Local package를 import 하는 경로에는 absolute path 와 relative path 가 있습니다.
-Absolute path는 이름 그대로 절대 경로 입니다. 왜 절대 경로인가 하니, import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하기 때문입니다.
└── my_app
├── main.py
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
├── module4.py
└── subpackage1
└── module5.py
Absolute path를 사용해 package1 과 package2를 import 하면 다음과 같이 나옵니다.
from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2
예를 들어, subpackage1의 module5 모듈의 function2 함수를 import 하기 위해서는 다음 경로를 거치게 됩니다.
파이썬에서는 dot.을 사용해서 경로를 표현 합니다.
my_app.package2.subpackage1.module5.py
이미 my_app 프로젝트 안에 있으므로 생략 가능합니다.
package2.subpackage1.module5.py
이걸 from import 키워드를 이용해 import 하면 다음과 같이 표현합니다.
from package2.subpackage1.module5 import function2
my_app 프로젝트 내에서는 어느 파일, 어느 위치에서 import 하던지 경로가 항상 위와 같이 동일하게 되므로 absolute path 라고 하는 것입니다.
최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 경로를 정의합니다. 그래서 일반적으로 relative path는 local package 안에서 다른 local package를 import 할때 사용됩니다.
예를 들어, package2의 module3에서 package2의 class1과 package2의 하위 package인 subpackage1의 module5의 function2 함수를 import 하려고 하면 다음 처럼 할 수 있습니다.
from . import class1
from . subpackage1.module5 import function2
여기서 dot .은 import 가 선언되는 파일의 현재 위치를 이야기 합니다.
현재위치는 package2/module3.py 이므로 현재 위치에서부터 원하는 모듈의 경로만 선언해주면 됩니다.
Relative path는 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있습니다.
그러므로 웬만한 경우 absolute path를 사용하는게 권장 됩니다.