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를 동시에 임포트할 수 있다.
'wecode > TIL 정리' 카테고리의 다른 글
위코드 Pre Course - 파이썬의 Iterator (0) | 2020.07.24 |
---|---|
위코드 Pre Course - 파이썬의 Comprehension (0) | 2020.07.24 |
위코드 Pre Course - 절대경로와 상대경로 (1) (0) | 2020.07.22 |
위코드 Pre Course - Python 1 (0) | 2020.07.21 |
위코드 Pre Course - 파이썬의 인수(Argument) (0) | 2020.07.21 |