sys.modules
와 sys.path
의 차이점sys.modules
dictionary
형태sys.path
list
형태sys
도 모듈인데, 파이썬은 sys
모듈의 위치를 어떻게 찾는지?sys
모듈은 파이썬에 이미 내장되어 있는 Bulit-In
Module 이므로 파이썬이 자동으로 찾을 수 있다.
calculator
패키지 만들기아래와 같은 패키지를 만들었다고 가정해보자.
각 파이썬 파일들은 아래와 같다.
# 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)
main.py
에서 상대경로(from .calculator.add_and_multiply import add_and_multiply
)로 add_and_mutiply
를 import 하려고 하면 아래와 같은 에러가 나타난다.
왜 그럴까?
파이썬 공식문서에서는 아래와 같다고 한다.
그러면 main.py
에서 사용되는 경로를, 상대 경로가 아니라 아래와 같이 절대 경로로 바꾼 후에 다시 시행해보자.
# 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))
# Output
5
정상적으로 출력이 되는걸 볼 수 있다.
먼저 상대 경로로 지정해주면,
# 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)
위 main.py
테스트를 했을 때랑 동일한 오류가 나타난다.
이번엔 절대 경로로 지정해줘보면,
# 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)
이와 같은 오류가 뜬다.
왜 이런 것일까?
add_and_multiply
파일은 calculator
이미 디렉터리 안에 존재하고 있는데 calculator
디렉토리를 지정해줬으니 더 상위에 있는 calculator
디렉토리를 찾으려고 하는 것이다.
그러다 보니 오류도 생기는 것이고..
__init__.py
파일의 역할디렉토리안에 __init__.py
파일을 생성을 해야만 파이썬에서 해당 디렉토리를 패키지로 인식을 한다.
python 3.3버전부터 __init.py__
가 없는 디렉토리도 패키지로 인식을 한다고 하지만, 하위 버전과의 호환을 위해 생성해두는 것이 좋다
상대 경로는 파일 위치가 변경되면 경로 위치도 변경된다고 해서 가급적 안쓰는게 낫다고 한다.
일단 절대 경로에 완전히 익숙해지도록 절대경로만 쓴 다음 어느정도 감이 온다 싶을 때 상대경로로 가야겠다.
참고
https://greendreamtrre.tistory.com/205
https://docs.python.org/ko/3/tutorial/modules.html#intra-package-references