다음과 같은 디렉토리 구조를 형성한다.
⚡️ init.py 파일에는 아무코드도 없지만 init 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 한다.
# 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))
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
def multiply(a,b):
return(a*b)
✔️ main.py에서 상대경로로 add_and_multiply 를 임포트하면 다음과 같은 에러가 발생한다.
ImportError: attempted relative import with no known parent package
✔️ 에러가 발생하는 이유는 파이썬 응용 프로그램의 메인 모듈로 사용될 목적의 모듈들은 반드시 절대경로로 임포트를 사용해야 한다.
# 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))
from .multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
부모패키지가 없이 상대경로 import를 실행한다는 오류가 출력된다.
ImportError: attempted relative import with no known parent package
from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
패키지를 인식하지 못한다.
ModuleNotFoundError: No module named 'calculator'
✔️ main 모듈과의 차이점
name 변수를 확인하는 조건문이 있어서 main 모듈을 실행할 때는 name 변수의 조건문이 이를 만족시켜 print 함수를 실행시킨다. 따라서 add_and_multiply.py 모듈은 절대경로와 상대경로 모두 정상적으로 작동이 가능하다.
✔️ __init__.py
파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다.
패키지에 포함된 디렉토리에 __init__.py
파일이 없다면 패키지로 인식되지 않는다.
✔️ __init__.py
파일에 __all__
변수를 설정함으로써 특정 디렉토리의 모듈을 *
을 사용하여 import할 때 import할 수 있는 모듈을 정의해 줄 수 있다.
ex)
# C:/doit/game/sound/__init__.py
__all__ = ['echo']