개발/ETC

[python] 표준 입출력 sys.stdout / sys.stderr?

wonpick 2023. 1. 22. 16:12

표준 입출력이란?

  • 표준 입력(stdin) 파이썬 함수 : input()
  • 표준출력(stdout) 함수 : print()

python의  print(), input() 같은 함수들은 시스템 함수를 활용해서 만들어진 입출력이 혼합된 함수이다. 

일종의 모듈(특정 기능들(함수, 변수, 클래스 등)이 구현되어있는 파일을 의미)이라고 볼 수 있고,
print()나 input()이 없었다면 표준입출력을 사용해야한다.

 

일단 내장함수 print의 정의를 보면 file=sys.stdout이 기본 인자(Arguement)로 전달되는 것을 알 수 있다.

print(*objects, sep=' ', end='\n', file=None, flush=False)(공식문서)
Print objects to the text stream file, separated by sep and followed by end. sep, end, file, and flush, if present, must be given as keyword arguments.
flush 등 인자값에 대한 자세한 설명

갑자기 헷갈리는 Parameter와 Arguement 차이▼

더보기

Parameter와 Arguement 차이


Parameter 매개변수 함수와 메서드 입력 변수(Variable) 명
Argument 전달인자, 인자 함수와 메서드의 입력 값(Value)
import sys # sys 모듈을 가져와서 사용하겠다는 의미
print("Python", "Java", file=sys.stdout) # 표준 출력 (defualt)
print("Python", "Java", file=sys.stderr) # 표준 에러

file= 에 sys.stdout에 아래 2개 input을 넣었을 때 결과는 크게 달라지지 않는다.

두가지의 출력의 용도는 다음과 같다.

  • sys.stdout (Standard Output, 표준 출력)
    • 프로그램 수행 과정에서 몇 시에 어떤 작업을 어떤 식으로 수행하고 있으며 그 결과는 어떠한지 등의 정보를 가지는 로그 
    • 사용자가 필수적으로 확인해야하는 에러 부분 로깅
  • sys.stderr (Standard Error, 표준 에러
    • 에러 발생 시 관련 내용을 출력
    • 나머지 디버깅에 필요한 정보는 stderr로 로깅

그래서 stdout / stderr 의 차이가 뭔데?

가장 큰 차이점은 버퍼링이다.

stdout(표준출력)은 줄 단위의 버퍼링(line buffering) 을 하지만 stderr(표준에러)는 버퍼링없이(Null buffering) 바로 출력이 된다. 

stdout / stderr

 

stdout / stderr 언제 써야하는거지?

정상적인 출력이 오류,경고,디버그 정보와 섞이는 걸 원하지 않는 경우에 stderr를 사용해야한다.

에러 케이스까지 다 표준출력으로 보내버리는 경우 이 문구가 에러인지 아닌지 구분하는 것이 어렵다 . 

따라서 에러로그를 따로 남겨야 디버깅 하기 쉽기 때문에 '에러에 대한 print는 stderr로' 보내는 것이 좋다. 

 

단순히 출력을 하는 이유라면 굳이 stderr를 써야할까?

>> 우리는 단순히 어디까지 정상적으로 돌아갔는지 확인하기 위해 msgInfo(0, ) 을 사용했다. 

msgType==1이 .. 과연 python파일을 돌리는데 필요한 것일까?.. 

에러 메시지 대신 내가 설정한 문구가 출력되는 것은 알겠으나, 모든 코드를 봐도 다 stdout으로 설정해놓던데.. 흠.. 

더 확인해봐야할 것 같다.

def msgInfo( msgType=1, msg="" ) : 
    nowTime = dt.datetime.today()
    pStr = "\t msgInfo>> [%s] : %s\n" % ( nowTime.strftime( '%Y-%m-%d %H:%M' ), msg ) 
    if msgType == 0 : sys.stdout.write(pStr)
    elif msgType == 1 : sys.stdout.write(pStr)

 


참고

1. 개발자가 stderr을 써야하는 이유 - warehaus

2. Python 기초 - 7.입출력 - 루카쓰로그