| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- ifnull
- 트래블테크
- having
- 서브쿼리
- MySQL
- alias
- join
- inner join
- date_format
- MAX
- IS NOT NULL
- IN
- GROUP BY
- 해외결제
- SubQuery
- IELTS
- programmers
- count
- Python
- Round
- LIMIT
- 금융IT
- where
- 날짜 포맷
- 금융 플랫폼
- order by
- is null
- 도서추천
- 투자자산운용사
- SQL
- Today
- Total
Every Step Matters
[python] 주피터노트북 sys.stdin.readline() 실행안됨 / 표준입력 / input()과의 차이점 본문
주피터노트북 sys.stdin.readline() 실행 오류
백준 15552번 빠른 A+B 문제를 푸는 중 문제가 생겼다.

기존에 쓰던 input()을 for문 안에 사용했을 때 "시간초과"가 발생한다는 것. 문제에서도 input()대신 sys.stdin.readline()을 이용해 입력하라고 안내가 되어 있다.

실제로 Jupyter notebook에서 input()을 사용해 직접 실행해보았을 때 테스트케이스의 개수 T를 적게 설정해서인지 시간초과가 나오지는 않았다.
#15552
t = int(input())
if t<=1000000:
for i in range(t):
a, b = map(int, input().split())
if 1<=a<=1000 and 1<=b<=1000:
print(a+b)
else:
print("조건을 만족하지 않습니다.")
else:
print("조건을 만족하지 않습니다.")
하지만 백준에서 해당 문제의 채점이 이루어지는 중에 시간초과가 떠서 이 문제를 해결하기 위해 sys.stdin.readline()을 이용한 코드 또한 만들었다.
#15552 - sys.stdin.readline()
import sys
t = int(input())
if t<=1000000:
for i in range(t):
a, b = map(int, sys.stdin.readline().split()) # input()대신 sys.stdin.readline()
if 1<=a<=1000 and 1<=b<=1000:
print(a+b)
else:
print("조건을 만족하지 않습니다.")
else:
print("조건을 만족하지 않습니다.")
그런데 이번에는 sys.stdin.readline()이 주피터노트북에서 제대로 실행되지 않는 문제가 발생했다.
sys 모듈을 설치하지 않아 생기는 문제인가 했지만 import sys를 통해 sys 모듈을 설치한 후에도 이상한 오류가 나왔다.

찾아보니 Jupyter Notebook, IPython과 같은 인터랙티브 환경에서는 표준입력(stdin)이 제대로 구성되어 있지 않기 때문에 stdin.readline()을 실행해도 입력을 받지 못하고 항상 빈 문자열이 반환된다고 한다. sys.stdin.readline()을 사용하고 싶다면 터미널이나 콘솔 환경 또는 해당 환경이 포함된 통합 개발 환경(IDE)에서 실행해야 한다.

그런데 여기서 또 의문점이 두 가지가 더 생겼다.
1. 인터렉티브 환경에서는 왜 표준입력이 제대로 실행되지 않는가?
2. 또 다른 표준입력 함수인 input()은 왜 인터렉티브 환경에서도 안정적으로 처리되는 것인가?
표준입력(Standard Input)이란?
프로그램이 외부에서 사용자로부터 데이터를 입력받는 방법을 의미한다.
표준입력 처리 과정
1) 터미널/콘솔 환경:
- 프로그램이 입력을 기다릴 때, 커서가 깜빡이며 입력을 기다리는 상태로 전환
- 사용자가 입력할 때까지 프로그램을 중단
- 사용자가 enter 키를 누르면 입력이 프로그램에 전달되고 그 값을 받아 처리함
2) 인터렉티브 환경:
- 셀 단위로 코드를 실행
- 셀이 실행될 때마다 코드의 결과를 즉시 출력
- 표준입력 사용 시 입력을 기다리는 동안 셀이 멈추는 것처럼 보일 수 있으며, 특정 입력함수의 경우 정상적으로 동작하지 않을 수 있음
인터렉티브 환경은 사용자가 입력할 때까지 프로그램을 중단하지 않고 셀이 실행되는 즉시 코드의 결과를 출력하기 때문에 표준입력을 사용할 때 함수가 제대로 동작하지 않을 수 있다.
input() VS sys.stdin.readline()
input() 함수는 UI 측면에서 더 간편하고 직관적으로 입력을 받도록 설계되어서 인터렉티브 환경에서도 잘 작동된다. 또한 parameter로 prompt message를 출력할 수 있으며, 입력받은 값의 개행문자(\n)를 삭제한 후 값을 리턴해준다.
sys.stdin.readline()의 경우 parameter로 prompt message를 출력할 수 없으며, 입력받은 값에 개행문자를 포함하여 값을 리턴하기 때문에 리턴받은 값에 rstrip() 함수를 추가로 적용해주는 게 일반적이다.
하지만 sys.stdin.readline()은 코드를 한 줄씩 읽어서 처리하며, 표준 입력에서 추가적인 처리를 하지 않으므로 작동 속도가 input() 함수보다 빠르다. 따라서 간단한 사용자 입력의 경우 input() 함수를 사용해도 무방하지만, 다수의 입력을 빠르게 처리해야 하거나 여러 줄의 입력을 반복적으로 받아야 하는 경우는 sys.stdin.readline() 함수를 사용하는 것이 유리하다.
참고
https://nabylab.com/파이썬-표준-입출력/
https://buyandpray.tistory.com/7
https://djm03178.tistory.com/21
'Python' 카테고리의 다른 글
| [Python] 파이썬 실행 방식 두가지 (0) | 2025.11.23 |
|---|---|
| [Python] 넘파이 없이 2차원 배열 생성하기 / 백준 ModuleNotFoundError (0) | 2024.08.29 |
| [python] 재귀함수 이해하기 / 두 개의 재귀 호출을 포함하는 경우 (0) | 2024.08.12 |
| [python] &와 and의 차이 (0) | 2024.08.12 |
| [Python] 맥북프로 주피터 노트북 설치하기 (0) | 2024.08.12 |