[Python] Path

eslim·2020년 8월 23일
0

Python

목록 보기
10/12
post-thumbnail
  • local package를 import 할때는 해당 package의 위치에 맞게 import 경로를 잘 선언해야한다. Local package를 import 하는 경로에는 absolute path 와 relative path 가 있다.

<예시>

└── my_app
    ├── main.py
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py
        ├── module4.py
        └── subpackage1
            └── module5.py
  • my_app 이라는 프로젝트 이며 package1과 package2 라는 2개의 package를 가지고 있으며 그리고 package2는 subpackage2 라는 중첩 package를 가지고 있다.

1. Absolute path

  • Absolute Path는 절대 경로이며, import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하다.

  • Absoulte path를 이용하여 위의 프로젝트 import 해보면

from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2
  • 경로들의 시작점이 전부 "my_app" 프로젝트의 가장 최상위 디렉토리이며, my_app 프로젝트 내에서는 어느 파일, 어느 위치에서 import 하던지 경로가 항상 위와 같이 동일하게 되므로 absolute path 라고 한다.

    참고로 current directory 라고 하는 현재의 프로젝트 디렉토리는 default로 sys.path 에 포함되며, absolute path는 current directory 로 부터 경로를 시작하게 되는것이다.

    일반적으로 local package를 import 할때는 absolute path를 사용한다.
    다만 absolute path를 사용하게 되면 한가지 단점이 있는데 바로 경로가 길어질 수 있다는 점이다. 이러한 단점을 보완하기 위해서 relative path를 사용할 수 있다.

2. Relative Path

  • import 하는 위치를 기준으로 경로를 정의한다. 그래서 일반적으로 relative path는 local package 안에서 다른 local package를 import 할때 사용된다.

  • Relative path를 이용하여 위의 프로젝트 import 해보면

# package2/module3.py
from . import class1
from .subpackage1.module5 import function2
  • 여기서 dot(.)은 import가 선언되는 파일의 현재 위치를 이야기하며, 현재위치는 package2/module3.py 이므로 현재 위치에서부터 원하는 모듈의 경로만 선언해주면 된다.

    Relative path는 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있기 때문에 absolute path를 사용하는게 권장된다.

3. Path - calculator 패키지 만들기

Assignment

 
  │─── calculator
  │      ├── __init__.py
  │      ├── add_and_multiply.py
  │      └── multiplication.py 
  └─── main.py
 	
  • [main.py]
# absoulte path
#from calculator.add_and_multiply import add_and_multiply 

# relative path
from .calculator.add_and_multiply import add_and_multiply

if __name__ == '__main__':
    print(add_and_multiply(1,2))
  • [add_and_multiply.py]
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
  • [multiplication.py]
def multiply(a,b):
    return(a*b)

Answer

4. main module 에서의 import

Assignment

main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러를 확인하고
다음의 파이썬 공식 문서를 참고해서 main module 에서는 패키지의 모듈을 어떻게 임포트 해야하는지 블로깅 해주세요.

Answer

  • 경로를 상대경로로 import한 경우에 위와 같이 에러가 발생한다.

  • 에러 발생 원인

if __name__ == '__main__':
    코드
  • 파이썬 인터프리터가 최초로 실행한 스크립트 파일의 name에는 'main'이 들어간다. 이는 프로그램의 시작점(entry point)이라는 뜻이며, if name == 'main':처럼 name 변수의 값이 'main'인지 확인하는 코드는 현재 스크립트 파일이 프로그램의 시작점이 맞는지 판단하는 작업이다. 즉, 스크립트 파일이 메인 프로그램으로 사용될 때와 모듈로 사용될 때를 구분하기 위한 용도이며, 메인 모듈의 이름은 항상 "main"이므로 Python 응용 프로그램의 메인 모듈로 사용하기위한 모듈은 항상 절대 가져 오기를 사용해야한다.

5. 절대 경로, 상대경로 import

Assignment

위의 add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 import 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해 보세요.

Answer

  • 절대경로
from calculator.multiplication import multiply

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)
  • 상대경로
from .multiplication import multiply

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)
  • 위 코드와 같이 main 시작점이 아닌 파일에서는 main.py 에서 상대경로로 import했을 때와 달리 상대경로, 절대경로가 정상적으로 작동하게 된다.

0개의 댓글