Absolute Path & Relative Path

Ju Seol·2021년 6월 9일
0

Local package를 import 하는 경로에는 absolute pathrelative path 가 있습니다.

Absolute Path

Absolute path는 이름 그대로 절대 경로 입니다. 왜 절대 경로인가 하니, import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하기 때문입니다.

└── my_app
    ├── main.py
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py
        ├── module4.py
        └── subpackage1
            └── module5.py

my_app 이라는 프로젝트 이며 package1package2 라는 2개의 package를 가지고 있습니다.
그리고 package2subpackage2 라는 중첩 package를 가지고 있습니다.
Absolute path를 사용해 package1package2를 import 하면 다음과 같습니다.

from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2

경로들의 시작점이 전부 my_app 프로젝트의 가장 최상위 디렉토리에서 시작하는것을 볼 수 있습니다.

예를 들어, subpackage1module5 모듈의 function2 함수를 import 하기 위해서는 다음 경로를 거치게 됩니다.

my_app => package2 => subpackage1 => module5.py

이걸 리눅스의 directory 경로 형식으로 바꾸면 다음처럼 표현 할 수 있습니다.

my_app/package2/subpackage1/module5.py

파이썬에서는 slash / 나 back slash \ 대신에 dot . 을 사용해서 경로를 표현 합니다.

my_app.package2.subpackage1.module5.py

이미 my_app 프로젝트 안에 있으므로 my_app 은 생략됩니다. 그러므로 다음처럼 경로를 표현하게 되는 것입니다.

package2.subpackage1.module5.py

이걸 from import 키워드를 사용해 import 하게 되면 다음 처럼 되는 것입니다.

from package2.subpackage1.module5 import function2

my_app 프로젝트 내에서는 어느 파일, 어느 위치에서 import 하던지 경로가 항상 위와 같이 동일하게 되므로 absolute path 라고 하는 것입니다.
참고로 current directory 라고 하는 현재의 프로젝트 디렉토리는 default로 sys.path 에 포함되게 됩니다.
그러므로 absolute path는 current directory 로 부터 경로를 시작하게 되는것입니다.
일반적으로 local package를 import 할때는 absolute path를 사용하면 됩니다.
다만 absolute path를 사용하게 되면 한가지 단점이 있는데 바로 경로가 길어질 수 있다는 점입니다.
그래서 이러한 단점을 보완하기 위해서 relative path를 사용할 수 있습니다.

Relative path

Relative path 는 absolute path와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 경로를 정의합니다. 그래서 일반적으로 relative path는 local package 안에서 다른 local package를 import 할때 사용됩니다.

# package2/module3.py

from . import class1
from .subpackage1.module5 import function2

여기서 dot .은 import 가 선언되는 파일의 현재 위치를 이야기 합니다.

현재위치는 package2/module3.py 이므로 현재 위치에서부터 원하는 모듈의 경로만 선언해주면 되는 것입니다.

또한 dot 2개를 사용할 수도 있습니다. dot 2개 .. 는 현재위치에서 상위 디렉토리로 가는 경로입니다.

# subpackage1/module5.py
from ..module4 import class4

Relative path는 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있습니다.

그러므로 웬만한 경우 absolute path를 사용하는게 권장 됩니다.

profile
Hello!

0개의 댓글