Python에서 ImportError는 모듈 자체 또는 모듈 내부의 특정 멤버(클래스, 함수 등)를 가져올 수 없을 때 발생하는 예외입니다. 이 오류는 주로 다음 두 가지 상황에서 발생합니다.
- 가져오려는 모듈이 존재하지 않는 경우
from X import Y구문에서 모듈 X 안에 Y라는 이름이 존재하지 않는 경우
1. 모듈이 존재하지 않는 경우
존재하지 않는 모듈을 import하려고 하면 ImportError가 발생합니다. 아래 예제는 존재하지 않는 'exception' 모듈에서 'myexception'을 가져오려다 예외를 잡아 출력하는 코드입니다.
import sys
try:
from exception import myexception
except Exception as e:
print(e)
print(type(e))
실행 결과
No module named 'exception'
<class 'ModuleNotFoundError'>
2. 모듈 내에 해당 멤버가 없는 경우
from X import Y 형태로 가져올 때, 모듈 X 내부에 Y가 정의되어 있지 않으면 역시 ImportError가 발생합니다. 아래 예제는 표준 라이브러리인 time 모듈에는 datetime이라는 이름이 없기 때문에 오류가 발생하는 상황입니다.
import sys
try:
from time import datetime
except Exception as e:
print(e)
print(type(e))
실행 결과
cannot import name 'datetime' from 'time'
<class 'ImportError'>
참고: Python 3의 ModuleNotFoundError
Python 3.6부터는 모듈 자체를 찾지 못한 경우 ImportError의 하위 클래스인 ModuleNotFoundError가 발생하도록 개선되었습니다. 따라서 모듈 누락과 멤버 누락을 구분해 처리하고 싶다면 except 절을 나누어 작성할 수 있습니다.
try:
from exception import myexception
except ModuleNotFoundError as e:
print("모듈을 찾을 수 없습니다:", e)
except ImportError as e:
print("멤버를 가져올 수 없습니다:", e)
이처럼 try-except 문으로 ImportError를 적절히 처리하면, 사용자에게 친숙한 오류 메시지를 제공하거나 대체 모듈로 우회하는 등 프로그램의 안정성을 크게 높일 수 있습니다.