(비개발자를 위한 사례) 사람이 볼 때만 묻기
프로그램에 “계속할까요?” 를 붙였더니 편해졌습니다. 그런데 자동으로 도는 순간, 같은 한 줄이 프로그램을 영원히 멈춰 세웁니다.
분기마다 엑셀 보고서를 만드는 파이썬 스크립트를 손보며 겪은 일입니다. 코드는 짧지만, 모르면 원인을 못 찾는 종류의 문제입니다.
문제
창이 멈춘 건지, 도는 건지
엑셀 파일을 만드는 데 25초가 걸립니다. 그동안 화면에는 아무것도 안 나옵니다. 멈춘 것처럼 보여서 자꾸 확인하게 됩니다.
더 불편한 건 그다음입니다. 파일을 더블클릭해서 실행하면 검은 창이 떴다가 결과를 읽기도 전에 사라집니다. 잘 됐는지 실패했는지 알 방법이 없습니다.
해결
진행을 보여주고, 끝에서 묻는다
두 가지를 넣었습니다. 하나는 어디까지 왔는지 한 줄씩 알려주는 것, 다른 하나는 끝나고 창을 닫을지 물어보는 것입니다.
· 안내 (0초)
· 전체 목록 (1초)
· 필터 7/11 (4초)
· 파일 저장 (9초)
✅ 완료 — 24.8초
무엇을 할까요?
[Enter] 창 닫기 [r] 다시 실행
>
끝에서 기다려 주니, 실패했을 때 창을 닫지 않고 바로 다시 시도할 수 있습니다.
함정
대답할 사람이 없으면
“물어본다” 는 건 대답을 기다린다는 뜻입니다. 그런데 프로그램이 늘 사람 앞에서 도는 건 아닙니다.
새벽 3시에 자동으로 도는 프로그램이라면
“계속할까요?” 를 띄우고 아침까지 그 자리에 서 있습니다. 겉으로는 도는 것처럼 보이니 더 나쁩니다. 두 시간짜리 작업이 1초 만에 멈춰 있어도 알아채기 어렵습니다.
방법
키보드가 있는지 먼저 본다
파이썬에는 isatty() 라는 게 있습니다. “내 앞에 진짜 키보드가 있나?” 를 알려주는 기능입니다. 전화를 걸어 상대가 사람인지 자동응답기인지 확인하고 말을 거는 것과 같습니다.
def 대화형(): # 사람이 보고 있을 때만 물어본다. # 파이프·백그라운드에서 물으면 그대로 멈춘다. try: return sys.stdin is not None and sys.stdin.isatty() except (AttributeError, ValueError): return False
마지막 except 두 줄이 필요한 이유 — 환경에 따라 sys.stdin 자체가 없거나 이미 닫혀 있을 수 있습니다. 그때 오류로 죽지 않고 “사람 없음” 으로 넘깁니다.
묻는다
사람이 보고 있다
검은 창에서 직접 실행
편집기 아래 터미널에서 실행
파일을 더블클릭
안 묻는다
대답할 사람이 없다
예약 실행 · 자동 실행
백그라운드 실행
결과를 파일이나 다른 프로그램으로 넘길 때
유의점
창은 보이는데 안 묻는 경우
가장 헷갈리는 대목입니다. 검은 창이 눈앞에 떠 있어도 아래처럼 실행하면 묻지 않습니다.
이렇게 실행하면
무슨 뜻인가
결과
python run.py
말이 화면으로 나온다
묻는다
python run.py > 기록.txt
말이 파일로 들어간다
안 묻는다
python run.py | more
말이 다른 프로그램으로 넘어간다
안 묻는다
화살표 > 나 막대 | 를 붙이면 프로그램의 말이 화면이 아닌 다른 곳으로 갑니다. 질문도 같이 딸려가서 화면에 안 보입니다. 그래서 아예 묻지 않게 해 두는 편이 안전합니다.
덧붙임
끄는 스위치도 같이 만들어 둔다
isatty() 로 대부분 자동 처리되지만, 손으로 끄는 방법도 함께 넣었습니다. 나중에 자동 실행을 붙일 때 코드를 다시 고치지 않아도 되기 때문입니다.
python run.py --no-pause # 묻지 않고 바로 끝낸다
지금 당장 쓸 일이 없어도 만들어 둡니다. 자동화는 대개 나중에, 급하게 붙습니다.
정리
같은 걸 만들 때 확인할 것
10초 넘게 걸리는 작업이면 진행 상황을 한 줄씩 내보낸다. 침묵은 고장처럼 보인다.
사람에게 무언가 묻기 전에 대답할 사람이 있는지 먼저 확인한다.
실패했을 때 창을 닫지 말고 무엇이 잘못됐는지 알려주고 다시 시도할 기회를 준다.
자동 실행 계획이 없어도 끄는 옵션을 미리 만들어 둔다.
실제 작업 중 겪은 일을 정리한 것입니다. 코드는 파이썬 기준이며, 같은 개념이 다른 언어에도 있습니다.