sys.modules
sys.path
Python에 포함되어 있는 내장 모듈이고, Built-in 모듈들은 기본적으로 내장 모듈에 대한 path정보가 default 값으로 지정되어있어 python이 쉽게 찾을 수 있습니다.
__init__.py 파일에는 아무코드도 없지만 init 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 합니다.
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)
상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러로 ImportError: attempted relative import with no known parent package가 발생한다. 공식문서를 통해서 확인해 보면 python에서 상대경로로 import할 때는 기준점을 잡기 위해 __name__ 변수를 이용한다. __name__ 변수는 모듈의 이름을 저장하고 있는데, main.py 파일에서 조건문 if __name__ == '__main__':의 의미는 현재 모듈이 main module(=시작점)일 경우에 조건을 실행하라는 뜻으로, -m 모듈이름 명령어는 해당 모듈을 sys.path에서 검색하고 그것을 main module로 실행하라는 의미이다.
main 모듈이 있는 프로젝트 폴더 외부에서 main 모듈의 경로를 명시한 뒤 실행하면 에러 없이 결과값이 나온다.
# 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))
error 없이 output이 출력 가능하다.
# from multiplication import multiply
from .multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
print(add_and_multiply(3,9))
출력시 ImportError가 발생한다. main.py때와 같이 main module인 add_and_multiply 모듈의 위치를 잡지 못해 발생하는 에러이다.
from multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
print(add_and_multiply(3,9))
error 없이 output이 출력 가능하다.
__init__.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다. 만약 패키지에 포함된 디렉터리에 __init__.py 파일이 없다면 패키지로 인식되지 않는다.
python3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식한다(PEP 420). 하지만 하위 버전 호환을 위해 __init__.py 파일을 생성하는 것이 안전한 방법이다. 출처