TIL# Python Relative path vs Absolute path

0
post-thumbnail

지난 시간에 우리는 package 와 module의 개념과 import하는 법과 어떻게 import가 되는 지의 과정에 대해 다뤗다.

  • Package & Modules

    이번에는 절대 경로와 상대경로가 무엇인지 알아보고 그것의 차이에 대해 알아보자.

Absoulte path(절대경로)

절대 경로는 단어의 의미에서 알 수 있듯이 어떠한 경로를 찾는데 있어서 고유의 경로를 말한다.

절대파일 경로는 파일 시스템의 루트에서 시작하여 주어진 파일 or 디렉토리에 엑세스 하는 방법이라고 할 수 있다.

  • 어디에서든 접근 가능한 경로 지정방식

  • absolute path를 사용시 단점: 경로가 길어질 수 있음

  • 루트 디렉토리(최상단 디렉토리)에서 시작함.

![image-20201125104219881](/Users/byul/Library/Application Support/typora-user-images/image-20201125104219881.png)

위의 그림을 예시로 들어보면, module5를 Import한다고 해보자 .

절대파일 경로의 측면에서 접근하면 my_app => package2 => subpackage1 => module5.py 이렇게 설명 할 수 있다.

이를 우리가 아는 파일 경로식으로 표현하면, my_app/package2/subpackage1/module5.py 표현 가능하다.

이걸 파이썬 표현으로 하면 my_app.package2.subpackage1.module5.py 으로 표현 할 수 있다.

tip : 파이썬에서는 slash (/) 나 back slack() 대신에 dot (.) 을 사용해서 경로를 표현

경로들의 모든 시작점이 "my_app"에서 시작 되는 것을 예시에서 보듯이 프로젝트의 가장 최상위 디렉토리에서 내려오는 방식이라고 생각하면 편하다.

Relative path(상대경로)

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

  • Root dicrectory(최상단 디렉토리)를 기준으로 경로를 잡는게 import하는 위치 기준으로 경로를 정의

  • 선언해야 하는 경로의 길이를 줄여준다는 장점

  • 절대경로와 반대로 선언할 시 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있음.

Package initialization

package가 import 될때 초기 설정을 해줘야 할때가 있습니다.파이썬은 init.py 파일을 통해 package 초기 설정을 가능하게 해줍니다.

Init.py ?

디렉토리가 패키지라는 것을 알려주는 역활이며 현재 버전 3.3 부터는 init.py가 없어도 패지키로 인식하도록 업데이트가 되었으나 호환성을 위해서 아직까지는 init.py를 제대로 활용하는 것이 좋다.

_init__.py의 역할

  • Import 할때 경로의 총 길이 줄여주기
  • Package에서 import 할 수 있는 변수/함수/클래스 제한하기
  1. Init.py파일에 매번 호출할때 쓰는 모듈이 있다면 그것을 불러주도록 설정하여 매번 호출해야하는 번거로움을 들 수 있다.\

현재 mymath패키지에서 mod1의 add함수를 import한다고 하면,

import my math.mod1

mymath.mod1.add()라고 매번 적어줘야한다. 이를 줄이기 위해 init py에 적어줌으로서 매번 import할 패지키의 경우 적을 경로 길이를 줄여줄 수 있다.

# __ init__.py
from .mod1 import add

# main.py
from mymath import add

add()

2.Package에서 import 할 수 있는 변수/함수/클래스 제한하기

내부적으로만 사용되는 함수의 경우 import 될시 함수 유출이 있을 수 있고, 무/유료로 버전을 나눈다고 했을때 import하고 싶지 않은 기능들은 init.py를 이용하여 제한 할 수 있다.

init.py내 에서 __all__ 변수를 설정하고 import할 수 있는 모듈을 정의함으로써, 이 안에 원하지 않은 요소들을 제외하고 넣어서 import하게끔 할 수 있다.

참조 자료:

python MDN : https://docs.python.org/3/tutorial/modules.html#intra-package-references

profile
문과생 개발자되다

0개의 댓글