실패했는데 종료 코드는 0 이었다 · 종료 코드 0 은 약속이다 · 퀴즈
퀴즈: 종료 코드와 두 개의 출력
문항 6개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
백업 검사 스크립트가 `print("backup missing!")` 만 찍고 끝났다. cron 이 본 종료 코드는?
- 예외가 없었으므로 0 이고, cron 은 성공으로 기록한다
- print 가 경고를 찍었으므로 1 이 된다
- 메시지에 느낌표가 있으면 파이썬이 2 로 끝낸다
- 표준 출력에 글이 남으면 종료 코드는 정의되지 않는다
sys.exit 문서가 적은 유닉스 관례에서 종료 코드 2 는 무엇에 쓰는가?
- 검사 대상이 조건을 어겼을 때
- 경고 수준의 문제가 있을 때
- 명령줄 문법(인자) 오류일 때
- 프로그램이 신호로 죽었을 때
logging.basicConfig 를 부르지 않고 log.warning() 을 썼다. 메시지는 어디로 가는가?
- 표준 출력으로 가고 형식은 메시지만이다
- 표준 오류로 가고 형식은 심각도:로거 이름:메시지 다
- 아무 데도 가지 않는다 — 핸들러가 없기 때문이다
- 현재 디렉터리의 app.log 파일에 쌓인다
도구가 JSON 을 표준 출력에 내는데 중간에 진행 메시지를 print() 로 찍었다. 무엇이 깨지는가?
- 종료 코드가 1 로 바뀌어 파이프라인이 멈춘다
- logging 핸들러가 중복 등록되어 메시지가 두 번 찍힌다
- 표준 오류가 비어서 사람이 진행 상황을 볼 수 없다
- 표준 출력에 JSON 이 아닌 줄이 섞여 다음 단계의 파싱이 실패한다
잡지 않은 예외로 끝난 파이썬 프로그램의 종료 코드와 출력은?
- 종료 코드 1, 트레이스백은 표준 오류에 찍힌다
- 종료 코드 2, 트레이스백은 표준 출력에 찍힌다
- 종료 코드 0, 트레이스백만 표준 오류에 찍힌다
- 종료 코드 1, 트레이스백은 표준 출력에 찍힌다
main(argv=None) -> int 와 파일 맨 아래의 sys.exit(main()) 모양을 권하는 이유는?
- parse_args 가 argv 없이는 동작하지 않기 때문이다
- 임포트해도 실행되지 않아 pytest 에서 main([...]) 을 직접 부를 수 있다
- sys.exit 을 함수 안에서 부르면 종료 코드가 무시되기 때문이다
- argparse 가 main 이라는 이름의 함수를 요구하기 때문이다