Python의 module과 package관련 몇 가지 적어보려고 한다!
이미 만들어져있는 Module, Package를 불러오거나 만들어서 파일안에 따로 코드를 적을 필요 없이 변수, 함수, 클래스 등을 사용할 수 있다
sys.modules
module
이나 package
를 찾기 위해 가장 먼저 확인하는 곳dict
이고 이미 import된 module과 package를 저장하고 있음sys.modules
에서 찾을 수 없음built-in modules
built-in module
은 이미 Python에 포함되어 나와서 쉽게 찾아짐sys.path
sys.path
는 기본적으로 list
이며 string
요소들을 가지고 있음list
의 각 경로를 확인하면서 해당 경로에 package가 위치 해 있는지 확인함sys.path
에서도 찾지 못하면 ModuleNotFoundError
를 리턴함
직접 개발한 Local package를 import 할 때는 해당 package위치에 맞게 import 경로를 잘 선언해야 하는데 경로를 선언하는 방법은 Absolute Path와 Relative Path가 있다!
from . import test1
같이 .
으로 import가 선언되는 파일의 현재 디렉토리로, ..
를 사용하면 현재 디렉토리에서 상위 디렉토리부분도 사용 가능sys.modules
는 dictionary
, sys.path
는 list
sys.modules
는 이미 import된 module과 package를 저장하여 Python이 다시 찾지 않아도 되게하는 기능이고 sys.path
는 import할 경로를 가지고 있음sys module은 파이썬에서 제공하는 Built-in module이기 때문에 python이 바로 탐색이 가능하다
package를 한번 만들어보자!
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))
__init__.py
👇🏻
# init파일은 아무 내용도 없지만 해당 디렉토리가 package임을 알려주는 역할!
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)
relative path로 import를 하게 될 경우 기준이 되는 module의 위치를 정할 때 __name__
속성에 의해 결정되는데 직접 실행시키는 module의 경우 __name__
속성이 __main__
이 되고 interpreter는 __main__
이라는 module의 위치를 알 수 없기 때문에 에러가 발생한다
에러 해결을 위해서는 직접 실행시키는 module에서의 import는 absolute path로 진행하면 된다
위 main.py
에서 absolute path로 add_and_multiply
module을 import했고 add_and_multiply
의 __name__
을 확인해보기 위해 Import했을때 __name__
을 출력할 수 있도록 코드를 수정해 줬다
from .multiplication import multiply
print(__name__) # 추가해준 코드
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
main.py
에서 실행 결과👇🏻
calculator.add_and_multiply
5
add_and_multiply
에서 출력한 __name__
의 결과는 calculator.add_and_multiply
로 확인할 수 있는데 이렇게 직접 실행하는 main이 아니면 relative path로 오류없이 정상적인 호출이 가능하다
물론 absolute path =>from calculator.multiplication import multiply
로 호출해도 오류없이 정상적인 호출이 가능하다
__init__.py
의 역할__init__.py
는 __init__.py
가 위치한 디렉토리를 Package module처럼 사용할 수 있도록 하는 기능
Python 3.3 버전부터는
__init__.py
가 없어도 package로 인식하지만 하위 버전 호환을 위해 파일을 생성하는 것이 좋음
Python이 처음으로 package를 가져올 때 자동으로 디렉토리 안의 __init__.py
에 있는 모든 코드를 실행하게 되므로 package에 있는 파일들에게 필요한 상태를 초기화하기 하는 용도로 설정하여 사용가능
파일 내부에 __all__
이라는 리스트를 사용하여 import *
을 할 때 불러올 module을 설정하여 원하는 module만 불러올 수 있게 할 수 있다
from calculator.multiplication import *
같이 마지막 항목이 module인 경우에는__init__.py
와 상관없이 전부 import됨
(module 내에__all__
이라는 list에 함수명을 추가하면 해결가능)
작성된 부분 중 잘못 된 부분은 댓글로 feedback 부탁드립니다👊🏻👊🏻👊🏻👊🏻