├── main.py
└── math
└── add.py
# main.py
from math.add import add
if __name__ == "__main__":
add_result = add(1,2)
print(add_result)
# math/add.py
def add(a: int, b: int) -> int:
return a + b
이와 같은 파일 구조에서 main.py
파일이 위치한 곳에서 $ python main.py
명령어를 실행시켜보면 아래와 같은 오류를 본 경험이 있을 것이다.
ModuleNotFoundError: No module named 'math.add'; 'math' is not a package
오류 메시지를 자세히 읽어보면 "'math' is not a package" 라고 적혀있다. 즉, 내가 생성한 "math"라는 디렉토리가 package가 아니라는 뜻이다. package란 간략하게 말해서 우리가 from A.B import func
과 같이 작성했을 때 A
는 package, B
는 module, func
은 module 안에 있는 함수라고 생각하면 된다.
다시 말해, 해당 오류는 "math 는 package가 아니기 때문에 사용할 수 없어!"라고 말하는 것이다.
그렇다면, 어떻게 오류를 해결할 수 있을까? 방법은 "math" 를 package로 만들어주면 된다.
그렇다면, 어떻게 package로 만들어줄 수 있을까? 바로 __init__.py
파일을 원하는 package 디렉터리(=math)에 넣어줌으로써 해당 디렉터리가 패키지의 일부임을 알려주도록 하면 된다.
├── main.py
└── math
├── __init__.py # 파일추가
└── add.py
그리고 맨 처음에 실행시켰던 명령어 $ python main.py
를 실행시켜보면 결과 값이 나올 것이다.
그렇다면 "__init__.py
에 아무것도 적지 않는데, 단지 package로 인식하게 해주는 것 밖에 없는건가?" 라고 생각할 수 있다. 패키지로 인식하게 해주는 기능도 있고 추가적으로 "math" 에 위치한 __init__.py
에는 공통으로 적용 가능한 기능이나 모듈을 포함할 수 있습니다. 해당 내용이 궁금하시다면 추가적으로 공부하시면 좋을 것 같습니다.
ps. 해당 글에 잘못된 부분이 있다면 댓글로 남겨주세요. 감사합니다:)