적을 알고 나를 알면 백번 싸워도 위태로움이 없으며, 적을 알지 못하고 나를 알면 한 번 이기고 한 번 지며, 적을 모르고 나를 모르면 싸움마다 반드시 위태롭다
- 손자(孫子)
저번 시간에 이어서 마저 해독을 해보자.
if (len(sys.argv) != 3):
print("wordcount.py input_file output_dir 형태로 실행해 주세요")
sys.exit(0)
else:
inputfile = sys.argv[1]
outputdir = sys.argv[2]
"if"라는 단어에서 유추할 수 있듯이
"만약에" 이러할 경우 어떻게 할 것 인가에 대한
조건문을 적을 수 있습니다.
그래서 if 문장 안에다 조건을 적는데
여기서 조건은 아래와 같습니다.
len(sys.argv) != 3
참고로 "len"이란 "length"의 줄임말로 길이를 뜻하는데,
파이썬의 세계에서는 길이가 곧 글자의 갯수를 말합니다.
예를 봅시다.
>>> a = 'apple'
>>> b = 'bear'
>>> print(len(a))
5
>>> print(len(b))
4
이렇게 글자의 갯수를 보여주는 것이 바로 이 len() 함수입니다.
그리고 파이썬의 세계에서는 "a와 b가 같다"라는 문장을
a == b
라고 표현합니다.
저번 글에서도 말했듯이
a = b 가 절대로 아닙니다!
(이것은 a라는 이름의 변수에 b가 들어있다는 뜻입니다!)
반대로 "a와 b가 같지 않다"라는 문장은
a != b
라고 표현을 하죠.
마지막으로 "sys.argv"는
sys라는 모듈에 argv라는 기능을 말하는 데
argv는 "argument vector"의 약자로
"인자값"이라는 뜻입니다.
인자값이란 함수(기능)을 호출할 때
함수에 전달되는 값을 말합니다.
보통 파이썬 파일을 실행할 때
인자값을 받아서 처리하게 된다.
그럴 때는 sys.argv를 그릇으로 삼아 값을 담을 수 있다.
예를 들어 hello.py 라는 파이썬 파일이 있다고 해보자.
hello.py 파일에는 다음과 같은 식이 있다.
import sys
print(sys.argv)
이 말은 hello.py 파일에는
sys가 불러와서 설치되어 있고,
sys의 기능 중 argv를 쓸 수 있다는 말이다.
그리고 print()라는 함수(기능)을 써서
sys.argv라는 그릇에 어떤 값들이 담겨져 있는지 볼 수 있게 한다.
이 상태에서 만약 터미널에서
C:\python>python hello.py hi
라고 입력하면
['hello.py', 'hi']
라는 배열값이 생긴다.
즉, sys.argv에 저런 값들이 생겨났다는 뜻이다.
배열은 '리스트(list)'라고 하는데
파이썬 세계에서의 리스트의 순서는
일상 세계에서의 순서와 다르다.
일상에선 첫번째가 1, 두번째가 2, 세번째가 3,
이런 식으로 세는 것이 상식이다.
하지만 파이썬의 세계에선 다르다.
첫번째가 0 , 두번째가 1, 세번째가 2이다.
왜 그런진 묻지 말자.
저도 이거 만든 사람에게 하소연하고 싶다.
왜 이렇게 인간의 상식과 관습에서 벗어난 짓을 했는지...!
하여튼 그렇게 해서 sys.argv에 값을 집어넣어서
리스트를 생성할 수 있다.
리스트의 순서에 따른 값을 보고 싶으면
리스트[숫자]
로 적으면 된다.
그렇게 예를 들면
sys.argv = ['hello.py', 'hi']
>>> print(sys.argv[0])
hello.py'
>>> print(sys.argv[1])
'hi'
가 된다.
즉, 첫번째 값은 파일의 경로, 즉 이름이고
두번째 값부터 인자값이 되는 것이다.
그리고 문제로 넘어가자.
문제의 조건문에서 볼 수 있듯이
if (len(sys.argv) != 3):
print("wordcount.py input_file output_dir 형태로 실행해 주세요")
sys.exit(0)
wordcount.py 라는 파이썬 파일을 만들고
그 파이썬 파일의 인자값을 'input_file'과 'output_dir'로 만들어라
라는 조건문을 만들고 있네요.
만약 wordcount.py가 그 조건을 만족하면
wordcount.py의 sys.argv는
sys.argv = ['wordcount.py', 'input_file', 'output_dir']
가 될 것입니다.
앞에 말했던 len() 함수 기억하시죠?
만약 리스트에다 len() 함수를 쓰게 되면
그 리스트 안에 있는 값들의 갯수를 말하게 됩니다.
그러므로 sys.argv 안의 값들을 계산하면 3,
식으로 쓰면,
>>> print(len(sys.argv))
3
가 되는 것이다.
즉 wordcount.py가 제대로 설정이 되었다는 것을 조건으로 두고 있고
만약 wordcount.py가 제대로 설정이 되지 않으면
len() 함수를 썼을 때 3이 나오지 않으므로
"wordcount.py input_file output_dir 형태로 실행해 주세요"
라고 안내를 한다음
sys를 exit, 즉 "종료" 하라고 설정 하는 것이다.
만약 조건을 만족하게 될 경우
>>> sys.argv[1]
'input_file'
>>> sys.argv[2]
'output_dir'
이 될 것이다.
그럼 다음으로 넘어가자.
else:
inputfile = sys.argv[1]
outputdir = sys.argv[2]
"else"는 "만약에 그렇지 않으면"이라는 뜻으로
if 문의 조건에 맞지 않게 될 경우에
생기는 일들을 설정한다.
즉, 그런 일이 발생하면
'inputfile'이란 이름의 변수에 sys.argv[1]을 집어넣고
'outputdir'이란 이름의 변수에 sys.argv[2]을 집어넣는다는 뜻이다.
휴! 정말 어렵다!
심지어 저도 이거 연구하느라 고생 많이 했습니다!
그래도 해냈네요!
오늘은 여기까지 하고 다음 시간에 만나요!