ModuleNotFoundError: No module named 'OOO'; 'OOO' is not a package

최더디·2021년 12월 3일
0
post-thumbnail

📌 오류 상황

├── 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. 해당 글에 잘못된 부분이 있다면 댓글로 남겨주세요. 감사합니다:)

profile
focus on why

0개의 댓글