Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬에서 EOFError 예외를 잡는 방법 완벽 가이드

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

동작 원리 설명

실행 결과는 다음과 같은 흐름으로 만들어집니다.

  1. 첫 번째 반복에서 input()이 파이프로 전달된 "hello"를 성공적으로 읽어 화면에 출력합니다.
  2. 두 번째 반복에서 input()이 다시 호출되지만, 더 이상 읽을 데이터가 없고 입력 스트림이 끝에 도달했기 때문에 EOFError가 발생합니다.
  3. except 블록이 이 예외를 잡아 "EOF when reading a line"이라는 메시지를 출력하고 프로그램이 정상적으로 종료됩니다.

참고: Python 2와 Python 3의 차이

원래 예제에 사용된 raw_input()은 Python 2에서만 제공되던 함수입니다. Python 3에서는 input() 하나로 통합되었으며, 이 글의 코드 역시 Python 3 기준으로 작성되었습니다. 구버전 Python 2 환경에서 실습한다면 raw_input()을 그대로 사용하면 됩니다.

이처럼 EOFError를 적절히 처리하면 입력이 갑자기 끊겨도 프로그램이 비정상 종료되지 않고 우아하게 마무리될 수 있습니다.