본문 바로가기
wecode/TIL 정리

위코드 Pre Course - 절대경로와 상대경로 (2)

by 왕거 2020. 7. 22.

calculator 이라는 이름의 패키지를 한번 직접 만들어보면서 import 진행할 때 절대경로, 상대경로 둘 중 어떤 방식을 선택했는지, 생성한 파일은 어떤 역할을 하는지 등을 정리해본다.

 

 

예제 패키지의 구조

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)

__init__.py

  • 빈 파일이지만 해당 파일이 있는 디렉토리가 패키지에 속한다는 것을 알려주기 위해서 존재함

상대경로와 절대경로

나열한 코드를 사용해서 실행을 해보면 에러가 발생하는데 import와 관련된 에러이다.

Traceback (most recent call last):
  File "c:\Users\alsdn\Documents\Study_dir\test_cal_dir\main.py", line 5, in <module>
    from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package
  • 에러의 원인
    • 파이썬 인터프리터가 relative import를 진행할 때, module 검색의 기준이 되는 위치를 __name__속성에 의해서 결정된다.
    • 터미널에서 직접 실행을 시킬 때 __name__ == '__main__'이 되므로 __main__이라는 모듈의 위치를 파이썬 인터프리터는 이해하지 못한다.
  • 에러를 해결하려면?
    • import 경로를 절대경로로 잡아주면 에러가 해결된다.
    • 파이썬 공식문서를 참고 결과, 메인 모듈로 사용할 목적의 모듈은 임포트 경로를 절대 경로를 사용해야 한다
# absoulte path
from calculator.add_and_multiply import add_and_multiply

if __name__ == '__main__':
    print(add_and_multiply(1,2))
    
########################################################
#실행결과
5

 

add_and_multiply.py에 상대경로와 절대경로를 사용해보자

  • 상대경로
from .multiplication import multiply	#상대경로로 지정

def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)
    
#################################################
#main.py 실행결과
5
  • 절대경로
from calculator.multiplication import multiply
def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)
    
###############################################
#main.py 실행결과
5

메인 목적으로 사용할 모듈이 아니라면 상대경로든 절대경로든 선택해서 사용이 가능하다.

 

__init__.py 의 역할

  • 먼저 명시했듯이 해당 파일이 있는 디렉토리를 패키지로 인식하게 하는 파일
  • 파이썬 공식문서에 따르면 이 파일은 디렉토리의 이름이 모듈 검색 경로에 등장하는 모듈의 이름을 가리는 일을 방지한다고 한다.
  • 빈 파일이지만 패키지의 초기화 코드를 실행할 수 있다.
  • __all__이라는 이름의 목록을 제공하면 여러 패키지를 동시에 임포트하는 * 명령에 대해서 대응할 수 있다.
    • 예를 들면 현재 만들어 본 calculator 디렉토리의 __init__.py에 __all__ = ["add_and_multiply", "multiply"]를 추가하면 from calculator import *의 코드에 add_and_multiply와 multiply를 동시에 임포트할 수 있다.