[Python101] 003. 입력. 사용자로부터 입력받기

지난 시간까지 계산 결과를 적절하게 출력하는 방법에 대해 살펴보았다. 어떤 처리 결과를 출력하는 방법을 보았으니, 이번에는 처리하기 위한 데이터를 입력 받는 방법을 살펴보겠다.

사용자 입력에는 여러 가지가 있다. 키보드로 입력을 받는 경우도 있고, 마우스로 클릭하거나 드래그하여 그림을 입력받는 경우도 있다. 이는 모두 사용자에 의한 직접적인 입력이다. 또 이런 식으로 사용자가 직접 입력을 하는 경우 말고 미리 작성된 파일로 부터 데이터를 읽어와서 처리하거나 인터넷 등 네트워크로부터 데이터를 전송받아 처리하는 경우들도 있다.

이러한 입력 방법 중에서 가장 쉽게 접근할 수 있는 키보드를 통한 입력에 대해 먼저 알아보도록 하자. 마우스를 통한 입력은 “창”이 있는 프로그램에서 쓰이는 방법인데, 아쉽게도 파이썬은 이런 프로그램을 만들 수는 있지만 상당히 많은 양의 코딩이 필요하다. (실제로 IDLE은 순수 파이썬으로 만들어진 편집기이다.) 이 부분은 나중에 기회가 되면 다루기로 하고 먼저 키보드를 통한 사용자 입력을 받아 처리하는 방법을 살펴보자.

키보드를 통한 사용자입력

키보드를 통한 사용자 입력 역시 엄밀히 이야기하면 2종류로 나뉠 수 있다. 하나는 파라미터로 입력을 받는 방법과 다른 하나는 프롬프트를 통해 입력을 받는 방법이다. 용어가 좀 어려운데 파라미터로 입력을 받는 방법은 옛날 도스 시절에 복사 명령을 보면 된다.

copy C:\원본.txt D:\backup\사본.txt

위의 명령은 원본.txt 파일을 D드라이브에 있는 backup 폴더에 사본.txt로 복사하는 명령이다. 이 명령은 다음과 같이 각각의 의미가 있는 요소로 분리될 수 있다.

{복사 프로그램} {파라미터1(원본위치)} {파라미터2(사본위치)}

이와 같이 프로그램을 실행할 때 프로그램 이름 다음에 공백으로 구분하여 붙여주는 단어들을 파라미터라고 한다. 파라미터로 주어진 문자열들은 프로그램에서 조금 특별한 방법으로 인식해서 처리할 수 있다. (우리는 나중에 이와 비슷한 파일 복사 프로그램을 작성해 볼 것이다.)

그리고 프롬프트로 입력을 받는 경우는 도스창(콘솔)이나 파이썬 쉘을 생각하면 된다. 파이썬 쉘은 실행되면 >>> 라고 프롬프트를 표시하고 사용자의 입력을 기다린다. 사용자는 실행하고자 하는 명령을 입력하고 엔터를 누르면 해당 명령을 실행해 결과를 보여준다.

파이썬에서 사용자의 입력을 이렇게 받도록 해주는 명령은 raw_input() 이라는 모듈이다. 이 모듈은 사용자가 “엔터”키를 누를 때가지 실행을 중지하고 키보드를 통해 입력을 받는다. 입력이 완료되면 사용자가 입력한 문자열을 돌려주게 된다. 따라서 이는 다음과 같은 형식으로 사용한다.

something_user_enter = raw_input("표시할 질문")

그럼 ex06.py를 작성하면서 어떻게 쓰이는지 살펴보도록 하겠다.

#-*-coding:utf-8-*-
age = raw_input( "How old are you?")
height = raw_input( "How tall are you?")
weight = raw_input( "How much do you weight?")

print "So, you're %r old, %r tall and %r heavy." % (age, height, weight)

코드를 타이핑한 후 실행하면 How old are you? 가 나오고 더 이상 출력되지 않는다. 적절한 값을 입력하고 엔터를 누를 때마다 다음 질문이 나온다. 질문에 모두 답을하면 답변 받은 내용을 합성하여 보여주게 된다.

How old are you?19years
How tall are you?180cm
How much do you weight?100kg
So, you're '19years' old, '180cm' tall and '100kg' heavy.

이 예제에서는 포맷 문자열에서 치환자를 %r을 썼다. 실질적으로 이 명령을 통해 입력받은 값들은 모두 “문자열로 인식”된다. 만약 1이라고 답을 해주면 숫자 1이 아닌 글자 “1”이라는 글자를 받은 셈이 된다. 따라서 이 값들은 바로 덧셈, 뺄셈, 나눗셈 등의 수식 계산을 할 수 없다.

코드의 내용은 간단하다. 각각 질문을 표시해주고, 입력받은 내용을 변수에 대입해 둔 다음, 마지막에 한 문장에 합성하여 표시해주는 것이 끝이다. 특히 %r 치환자를 사용하면 문자열의 양 옆으로 따옴표가 생기는 점에 주목하자. 만약 키를 9′ 로 입력하면 어떻게 출력되는지도 관찰해 보라.

환경 변수로부터 파라미터 받기

위의 내용으로 다른 활용을 해보기 전에 이번에는 파라미터를 받는 법을 배워보자. 이전에는 보지 못했던 구문들이 나오는데, 일단 열심히 그리고 정확하게 타이핑해보라.

ex07.py

from sys import argv

script, first, second, third = argv

print "The script is called:", script
print "Your first variable is:", first
print "Your second vaiable is:", second
print "Your third vaiable is:", third

이를 IDLE에서 실행하면 실행이 되지 않고 오류가 난다.

Traceback (most recent call last):
  File "C:\Apps\textfiles\Learn Python the hard way\ex13.py", line 3, in <module>
    script, first, second, third = argv
ValueError: need more than 1 value to unpack

오류의 원인은 맨 마지막에 나오는데 unpack 할 값이 모자라다는 것이다. unpacking에 대해서는 조금 뒤에 설명할 것이니, 이제는 “콘솔에서 파이썬을 실행”해야 한다.

맥OSX 사용자는 ‘터미널’ 프로그램을 실행한다. 실행한 다음 파이썬 예제 파일을 저장해둔 폴더로 간다. 만약 문서 폴더 아래에 py 라는 폴더에 파일을 저장했다면 다음 명령으로 해당 폴더로 이동한다. ( $ 기호는 프롬프트이므로 입력하지 않는다.)

$ cd Document/pys

해당 파일(ex07.py)이 있는지 보기 위해서는 ls 명령을 실행해본다.

$ ls

파일이 있는 것이 확인되면 다음과 같이 실행해 준다.

$ python ex07.py 1 2 3

윈도 7 환경에서는 조금 명령이 다르다. 시작 메뉴 버튼을 눌러 cmd 를 입력하고 엔터한다. 우리가 흔히 도스창이라 부르는 콘솔이 나타난다. 만약 예제 파일을 저장한 위치가 c:\pys 라면 다음 명령을 입력하여 해당 폴더로 이동해야 한다. (마찬가지로 > 기호는 프롬프트 이므로 입력하지 않는다.) 특히, 윈도에서는 슬래시가 아닌 역슬래시이므로 주의하자. (콘솔에서는 원 표시로 표시될 것이다.)

> cd c:\py

파일이 있는지 보기 위해서는 dir 명령을 이용한다.

> dir

다음 python을 같은 방식으로 실행한다.

> python ex07.py 1 2 3

만약, 실행이 되지 않고 알 수 없는 명령이라고 하면 환경 변수에 파이썬 경로가 추가되지 않았다. 000번 강좌를 보고 path 를 수정해주어야 한다. 그렇지 않다면 다음과 같이 파이썬의 경로를 다 써줘도 상관없다.

> c:\python27\python ex07.py 1 2 3

다음과 같은 식으로 전체 실행 과정을 표시해 주겠다.

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.

C:\Users\MYMYMYMY>cd c:\Apps\textfiles

c:\Apps\textfiles>dir
C 드라이브의 볼륨: OS
볼륨 일련 번호: 28B9-A7BB

c:\Apps\textfiles 디렉터리

2012-04-20  오후 04:14    <DIR>          .
2012-04-20  오후 04:14    <DIR>          ..
2012-04-19  오후 04:03                44 ex00.py
2012-04-20  오후 01:05               719 ex02.py
2012-04-20  오후 01:28               462 ex03.py
2012-04-20  오후 02:42               413 ex04.py
2012-04-20  오후 02:48               373 ex05.py
2012-04-20  오후 03:50               225 ex06.py
2012-04-20  오후 04:14               222 ex07.py
2012-04-19  오후 03:45    <DIR>          Learn Python the hard way
7개 파일               2,458 바이트
3개 디렉터리  172,006,219,776 바이트 남음

c:\Apps\textfiles>c:\Python27\python ex07.py 1 2 3
The script is called: ex07.py
Your first variable is: 1
Your second vaiable is: 2
Your third vaiable is: 3

c:\Apps\textfiles>

이제 신기하게도 명령 줄에서 입력한 문자가 프로그램 속으로 전달되어 표시되는 것을 볼 수 있다. (콘솔이나 터미널에서는 화살표 위쪽 방향키를 누르면 이전에 입력된 명령이 다시 표시되니, 쉽게 다른 글자로 바꿔 넣어보도록 하자.)

이제 원래 코드가 무슨 역할을 하는지 살펴보도록 하자

1) from sys import arvg : 이 문장은 sys 라는 모듈로부터 arvg 라는 모듈을 가져와서 사용할 수 있도록 한다는 의미이다. 대부분의 파이썬 프로그램은 모듈이라는 단위로 구성이 된다. sys라는 모듈에는 아주 많은 하위 모듈들이 있는데, 이 중에서 argv 라는 모듈을 가져와서 쓰겠다는 말이다.

sys 모듈은 파이썬이 실행되고 있는 환경에 대한 정보를 얻거나 변경할 수 있도록 해주는 모듈이다. 그리고  argv는 파라미터의 목록을 가져오는 모듈이다. 여기에 무슨 값이 들어가는지 생각해보자.

python ex07.py 1 2 3
------ ------- - - -
0      1       2 3 4

위는 방금 이 프로그램을 실행한 명령이다. 먼저 python은 파이썬 인터프리터를 실행하는 명령이다. 이 명령 뒤에 파라미터들이 붙어서 들어간다. 이들은 순서대로 ex07.py, 1, 2, 3 총 4개의 파라미터가 붙게 된다. (IDLE에서는 실행시에 python ex07.py 까지만 실행해준다.)

2) 3행은 argv에 들어있는 값을 쪼개서 4개의 변수에 순서대로 담아주게 된다. 즉 script, first, second, third 의 4개에 대해 argv에 들어있는 4개의 파라미터를 순서대로 담아준다.

순서대로 묶여있는 “데이터 묶음”을 이런 방식으로 대입해서 나누는 것을 unpacking 이라고 한다. 당장 unpacking을 외우거나 이해할 필요는 없다. 나중에 다시 보게 될 것이다. 이제 각 변수에 어떤 값이 들어가 있을 지 예상이 될 것이다. 나머지 부분은 각 파라미터로 들어온 변수를 개별적으로 출력해주는 부분이다.

효율적이지 못하다고 판단되는가? 그럴 수도 있다. 단순히 아이콘만 클릭해서 프로그램을 실행하는 것과는 무척이나 다르고 번거롭다. 하지만 이런 방식에 어느 정도 친해질 필요가 있다.

  • 디렉토리 이름을 일일이 타이핑하는 것은 무척 귀찮지만, 사실 tab 키를 사용하면 쉽게 입력할 수 있다. C:\py 까지만 입력하고 탭을 눌러보라. py로 시작하는 파일이나 폴더 이름이 자동으로 완성된다. 두 번 세 번 누르면 Py 로 시작하는 다른 폴더나 파일이 나타날 것이다. 이 방식으로 쉽게 디렉토리를 이동할 수 있다.
  • 콘솔을 통해 이 폴더 저 폴더를 다닌다는 것은 그만큼 컴퓨터의 파일 시스템을 여기 저기 엿볼 수 있는 기회가 된다. 특히 나중에 데이터를 파일에 저장하고 싶은 경우가 생길 텐데, 그 때 상당히 도움이 될 수 있다.
  • mac의 경우에는 터미널을 통해 문제를 수정하거나 숨겨진 설정을 변경하는 경우가 종종 있다. 터미널을 사용하는 방법을 조금 익혀두는 것은 자기 컴퓨터를 관리하는 능력을 약간 더 향상 시키는 셈이다.
  • 파이썬으로는 GUI가 있는 프로그램을 만들기는 좀 어렵지만, 명령줄 프로그램은 간단한 경우 단 몇 줄의 코드로도 만들 수 있다. 실제로 구동 화면이 없는 이런 프로그램들에 대해 실제로 파이썬은 아주 “많이 쓰이는” 인기 있는 언어이다. (구글 서버의 많은 프로그램들도 파이썬으로 만들어서 사용되고 있다.)

ex08.py

이번에는 위의 두 예제를 결합했다. 먼저 코드를 보자.

from sys import argv

script, user_name = argv
prompt = '> '

print "Hi %s, I'm the %s script." % (user_name, script)
print "I'd like to ask you a few questions."
    print "Do you like me %s?" % user_name
likes = raw_input(prompt)

    print "Where do you live %s" % user_name
lives = raw_input(prompt)

    print "What kind of computer do you have?"
computer = raw_input(prompt)

    print """
    Alright, so you said %r about liking me.
    You live in %r. Not sure where that is.
    And you have a %r computer. Nice.
    """ % (likes, lives, computer)

ex07.py와 같은 방식으로 실행해보자. python ex08.py sooop 이라고 치니 다음과 같이 표시된다.

c:\Apps\textfiles>c:\Python27\python.exe ex08.py sooop
Hi sooop, I'm the ex08.py script.
I'd like to ask you a few questions.
Do you like me sooop?
> Yes
Where do you live sooop
> Seoul
What kind of computer do you have?
> NG

Alright, so you said 'Yes' about liking me.
You live in 'Seoul'. Not sure where that is.
And you have a 'NG' computer. Nice.

코드는 별다르게 분석할 것이 없을만큼 간단한 내용이다. ex08.py의 각 라인의 위에 #을 넣어 바로 아래줄이 어떤 역할을 하는지 주석을 달아보자. 자신이 작성한 코드를 이런 식으로 다시 분석하는 것은 프로그래밍을 배우는 속도를 높이는데 큰 도움이 될 수 있다. 또한 작성한 코드를 소리내어 읽어보는 것 또한 도움이 될 수 있다. (익숙해지면 잘 알지 못해도 잘 아는 것처럼 느끼는 심리때문이다.)

이번 시간의 내용을 다시 한 번 정리하자.

  • 사용자의 입력은 프롬프트를 통해 직접, 그리고 매번 입력받는다. raw_input() 명령을 사용한다.
  • 입력받은 값은 ‘문자열’이다. 포맷팅에서 %s를 사용하고 있다.
  • 파라미터는 sys 모듈의 argv 모듈을 사용해 얻을 수 있다. 스크립트의 이름부터 그 뒤로 일련의 문자열들을 받아올 수 있다.
  • 콘솔 (도스창이나 터미널)의 기본적인 사용방법을 알아두자. (이는 기회가 있으면 글을 추가하겠다.)