Module과 Package에 대한 고찰

jinatra·2021년 8월 11일
0

Python

목록 보기
14/15
post-thumbnail

Module과 Package에 대한 고찰


sys.modulessys.path의 차이점

sys.modules

  • 파이썬이 모듈과 패키지를 탐색할 때 첫번째로 확인하는 위치
  • dictionary 형태

sys.path

  • 파이썬이 모듈과 패키지를 탐색할 때 세번째로 확인하는 위치
  • list 형태


import 해야하는 sys도 모듈인데, 파이썬은 sys 모듈의 위치를 어떻게 찾는지?

sys 모듈은 파이썬에 이미 내장되어 있는 Bulit-In Module 이므로 파이썬이 자동으로 찾을 수 있다.


Absolute path vs. Relative path

Absolute path

  • 절대 경로
  • import를 하는 파일이나 경로에 상관없이 항상 경로가 동일

Relative path

  • 상대 경로
  • import 하는 위치를 기준으로 경로를 정의

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에서 multiply함수를 절대경로와 상대경로 각각 임포트해보자

먼저 상대 경로로 지정해주면,

# 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__가 없는 디렉토리도 패키지로 인식을 한다고 하지만, 하위 버전과의 호환을 위해 생성해두는 것이 좋다





Take Away

가급적이면 절대경로에 익숙해지자

상대 경로는 파일 위치가 변경되면 경로 위치도 변경된다고 해서 가급적 안쓰는게 낫다고 한다.
일단 절대 경로에 완전히 익숙해지도록 절대경로만 쓴 다음 어느정도 감이 온다 싶을 때 상대경로로 가야겠다.





참고
https://greendreamtrre.tistory.com/205
https://docs.python.org/ko/3/tutorial/modules.html#intra-package-references

profile
으악

0개의 댓글