본문 바로가기
C.W.K.
Stream
Lesson 07 of 07 · published

입력과 출력이 만나면 스크립트가 된다

~22 min · print, input, sys.argv, stdin, stdout, stderr, main, 스크립트

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

print는 화면에만 쓰는 함수가 아니야

print는 여러 값을 구분자와 끝문자를 정해 출력하고, 필요하면 다른 파일 객체로 보낼 수 있어. flush는 버퍼를 바로 비워야 하는 진행 표시나 파이프에서 쓰여.

input은 언제나 문자열을 돌려줘

input은 한 줄을 읽어 줄바꿈을 뺀 문자열로 반환해. 숫자가 필요하면 intfloat로 바꿔야 하고, 변환 실패를 어떻게 처리할지도 프로그램이 정해야 해.

명령행 인자와 실행 진입점

sys.argv에는 스크립트 이름과 뒤따른 인자가 문자열로 담겨. 파일이 직접 실행됐을 때만 동작해야 하는 코드는 if __name__ == '__main__': 아래에 둬. 그러면 같은 파일을 가져와 함수만 재사용할 수도 있어.

세 개의 표준 통로

stdin은 입력, stdout은 정상 결과, stderr는 진단과 오류를 맡아. 결과와 오류를 나누면 한 프로그램의 stdout을 다음 프로그램의 stdin으로 연결하면서도 문제 메시지는 화면에서 볼 수 있어. 이것이 작은 도구들이 파이프로 합쳐지는 기본 계약이야.

원칙: 다른 도구가 소비할 결과는 stdout으로, 사람이 고칠 문제는 stderr로 보내.

Code

print의 네 가지 선택 인자·python
>>> print("a", "b", "c")                         # default sep=' ', end='\n'
a b c

>>> print("a", "b", "c", sep="|")
a|b|c

>>> print("loading", end="")                     # 줄바꿈 없음 — progress 표시에 유용
loading
>>> for i in range(3):
...     print(".", end="", flush=True)            # flush 가 즉시 출력 강제
...
...

>>> import sys
>>> print("앗", file=sys.stderr)                  # 에러 메시지는 stderr
앗
input은 항상 문자열을 반환한다·python
name = input("이름? ")
age_str = input("나이? ")
age = int(age_str)               # input 은 항상 str — 필요하면 변환

print(f"안녕 {name}, 내년엔 {age + 1} 살.")

# EOF 처리 (예 — pipe 입력 끝남):
try:
    line = input()
except EOFError:
    print("입력 끝.", file=sys.stderr)
sys.argv로 명령행 인자 읽기·python
# greet.py
import sys

if len(sys.argv) < 2:
    print(f"사용법: {sys.argv[0]} <이름>", file=sys.stderr)
    sys.exit(1)

name = sys.argv[1]
print(f"안녕, {name}!")

# 실행:
# $ python greet.py 피파
# 안녕, 피파!
# $ python greet.py
# 사용법: greet.py <이름>
# $ echo $?      # exit code
# 1
직접 실행과 import를 나누는 진입점·python
# greeter.py
def make_greeting(name):
    """친근한 인사 반환."""
    return f"안녕, {name}!"

def main():
    import sys
    if len(sys.argv) > 1:
        print(make_greeting(sys.argv[1]))
    else:
        print(make_greeting("world"))

if __name__ == "__main__":
    main()

# 이제 이 파일 두 가지로 동작:
# (1) 스크립트로:        python greeter.py 피파
# (2) 라이브러리로:       from greeter import make_greeting
#                         make_greeting("피파")  # '안녕, 피파!'
stdin·stdout·stderr를 나눠 쓰기·python
# uppercase.py — stdin 읽고 대문자로 stdout 에 씀
import sys

for line in sys.stdin:
    print(line.rstrip().upper())

# 다른 Unix 도구와 합성:
# $ echo 'hello world' | python uppercase.py
# HELLO WORLD

# $ cat names.txt | python uppercase.py | sort
# (full Unix 파이프라인 — Python 스크립트가 한 단계일 뿐)

# 에러는 stderr 로 — stdout 이 redirect 돼도 보여:
# $ python uppercase.py < input.txt > output.txt
# (sys.stderr 로 print 한 건 그래도 터미널에 떠)

External links

Exercise

repeat.py를 만들어 문자열과 횟수 두 인자를 받아 그 문자열을 지정한 횟수만큼 한 줄씩 출력해. 아직 argparse 없이 sys.argv를 쓰고, if __name__ == '__main__': 진입점을 둬. 인자가 없거나 횟수가 정수가 아니면 stderr에 설명을 쓰고 종료 코드 1을 반환해. 마지막에는 출력을 wc -l로 넘겨 줄 수가 맞는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.