EOFError란 무엇인가?
EOFError는 input() 같은 내장 함수가 입력 스트림의 끝(EOF)에 도달했는데 아무 데이터도 읽지 못한 경우에 발생하는 예외입니다. 반면 파일 객체의 read() 메서드처럼 파일을 다루는 함수들은 파일 끝에 도달하면 빈 문자열을 반환하기 때문에 예외가 발생하지 않습니다.
즉, 프로그램이 사용자 입력을 기다리고 있는데 더 이상 읽을 데이터가 없을 때 EOFError가 발생합니다. 대표적인 발생 상황은 다음과 같습니다.
- 터미널에서 Ctrl+D(Linux/macOS) 또는 Ctrl+Z(Windows)를 눌러 입력을 종료했을 때
- 파이프(
|)로 전달된 입력이 모두 소진되었을 때 - 내용이 비어 있는 파일에서 입력을 읽으려고 할 때
EOFError 잡기 예제
다음 코드는 무한 루프 안에서 계속 입력을 읽다가, 입력 스트림이 끝나면 EOFError를 잡아 처리하는 방법을 보여줍니다.
# eofError.py
try:
while True:
data = input('prompt:')
print('READ:', data)
except EOFError as e:
print(e)
터미널에서 echo 명령으로 "hello"라는 문자열을 파이프로 스크립트에 전달하여 실행해 보겠습니다.
$ echo hello | python eofError.py
실행 결과
prompt:READ: hello
prompt:EOF when reading a line
동작 원리 설명
실행 결과는 다음과 같은 흐름으로 만들어집니다.
- 첫 번째 반복에서
input()이 파이프로 전달된 "hello"를 성공적으로 읽어 화면에 출력합니다. - 두 번째 반복에서
input()이 다시 호출되지만, 더 이상 읽을 데이터가 없고 입력 스트림이 끝에 도달했기 때문에 EOFError가 발생합니다. except블록이 이 예외를 잡아 "EOF when reading a line"이라는 메시지를 출력하고 프로그램이 정상적으로 종료됩니다.
참고: Python 2와 Python 3의 차이
원래 예제에 사용된 raw_input()은 Python 2에서만 제공되던 함수입니다. Python 3에서는 input() 하나로 통합되었으며, 이 글의 코드 역시 Python 3 기준으로 작성되었습니다. 구버전 Python 2 환경에서 실습한다면 raw_input()을 그대로 사용하면 됩니다.
이처럼 EOFError를 적절히 처리하면 입력이 갑자기 끊겨도 프로그램이 비정상 종료되지 않고 우아하게 마무리될 수 있습니다.