module일 경우에는 파이썬 파일, package의 경우 파이썬 파일들은 담고 있는 디렉토리들을 파이썬이 찾아야 import를 한다.
파이썬은 3가지 장소를 순서대로 보면서 찾는다.
sys.modules → built-in mudules → sys.path
sys.modules
에서 찾을 수 없음ModuleNotFoundError
를 리턴import sys print(sys.path)
['/Users/hwangjaeseung/Desktop/Back-End/Wecode Repl.it WorkSpace', '/Library/Frameworks/Python.framework/Versions/3.10/lib/python310.zip', '/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10', '/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages']
sys:: 파이썬에 포함된 모듈이기때문에 built-in modules에서 찾을 수 있음
absolute path::
import를 하는 파일이나 경로에 상관없이 프로젝트의 최상단 디렉토리를 기준으로 경로를 정의
relative path::
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)
위와 같이 실행 시, 아래와 같은 오류 발생.
File "/Users/hwangjaeseung/Desktop/Back-End/Wecode Repl.it WorkSpace/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 path로 import를 시도해서 발생한 에러
파이썬 공식 문서에서는 해당 에러와 관련하여 다음과 같이 설명하고 있다.
따라서,
main.py
의 relative path -> absoulte path로 변경하면
# 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))
문제없이 "5"
가 출력된다.
add_and_multiply.py
Absolute path
from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply (a,b) + (a+b)
# 출력결과: "5"
Relative path
from .multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
# 출력결과: "5"
__init__.py
의 역할파일이 존재하는 디렉터리가 패키지임을 명시
즉, 해당 디렉터리가 패키지의 일부임을 알려주는 역할
ex) add_and_multiply.py와 multiplication.py 패키지에 포함된 디렉터리에 init.py 파일이 없다면 패키지로 인식 X