순으로 찾습니다.
파이썬은 list의 각 경로를 하나 하나 확인하면서 해당 경로에 import 하고자 하는 package가 위치해 있는지 확인합니다.
참고로 sys 는 파이썬에 포함되어 있는 모듈입니다. 그러므로 다음 처럼 sys 모듈을 import 해서 sys.modules와 sys.path 를 출력할수도 있고 수정 할 수 도 있습니다.
파이썬은 import 하고자 하는 모듈과 package를 찾을때에 먼저 sys.modules를 보고, 없으면 파이썬 built-in 모듈들을 확인 하고 마지막으로 sys.path에 지정되어 있는 경로들을 확인해서 찾습니다.
sys.path 에서도 못찾으면 ModuleNotFoundError 에러를 리턴합니다.
각자 방법에는 장,단점이 있습니다. Relative path는 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있습니다. 그러므로 웬만한 경우 absolute path를 사용하는게 권장 됩니다.
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)
이렇게 패키지와 모듈을 구성하고 실행을 해보면
Traceback (most recent call last):
File "C:\Users\준모\AppData\Local\Programs\Python\Python38-32\Project\main.py", line 5, in
from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package
이러한 에러를 볼 수 있습니다. 이는 공식 문서에서 확인이 가능합니다.
Note that relative imports are based on the name of the current module. Since the name of the main module is always "main", modules intended for use as the main module of a Python application must always use absolute imports.
main_module에서 다시 절대적 경로로 변경하여 실행을 해보면
main.py
#absoulte path
from Project.calculator.add_and_multiply import add_and_multiply
if name == 'main':
print(add_and_multiply(1,2))
= RESTART: C:\Users\준모\AppData\Local\Programs\Python\Python38-32\Project\main.py
5
결과가 잘 나옵니다.
이번엔 main.py이 아닌 add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 import 해보겠습니다.
add_and_multiply.py(절대적 경로)
from Project.calculator.multiplication import multiply
#from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
제대로 작동이 됩니다. 그럼 이번엔
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)
Traceback (most recent call last):
File "C:\Users\준모\AppData\Local\Programs\Python\Python38-32\Project\calculator\add_and_multiply.py", line 1, in
from .multiplication import multiply
ImportError: attempted relative import with no known parent package
이러한 에러를 볼 수 있는데, 이는 위에서 말한대로 상대적 경로는 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 경로를 정의하기 때문에 해당 코드를 이렇게 바꿔줍니다.
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)
제대로 작동하는 모습을 볼 수 있습니다.
all
패키지 안에서 'import ' 로 사용하고 싶다면 init.py 파일 안의 all 변수에 로 선언할 때 호출할 모듈들을 선언해줘야 합니다.
선언 방법은 all = ['포함될 모듈 네임', '포함될 모듈 네임', '포함된 모듈 네임', ...]