지금까지는
input()을 사용해 프로그램 실행 중에 사용자에게 값을 입력받았다.
이번에는 프로그램을 실행할 때 명령 프롬프트에서 값을 함께 전달하는 방법을 알아본다.
일반적인 명령어는 다음과 같은 형태로 실행된다.
명령어 [인수1 인수2 ...]
예를 들어 Windows 명령 프롬프트에서
type a.txt
라고 입력하면 type 명령어에 a.txt라는 인수를 전달하는 것이다.
type a.txt
↓ ↓
명령어 인수
파이썬 프로그램도 이와 비슷하게 실행할 수 있다.
python 프로그램.py 인수1 인수2 인수3
1. 프로그램에 인수 전달하기
2. sys 모듈 사용하기
3. 명령행 인수 출력하기
4. 전달받은 문자열을 대문자로 변경하기
5. input()과 sys.argv 비교
6. 핵심 정리
명령 프롬프트에서는 프로그램이나 명령어 뒤에 값을 붙여 실행하는 경우가 많다.
예를 들어
python test.py hello
라고 실행했다면
python → 파이썬 실행
test.py → 실행할 파이썬 파일
hello → 프로그램에 전달할 인수
라고 볼 수 있다.
여러 개의 인수를 전달할 수도 있다.
python test.py aaa bbb ccc
이 경우 프로그램에는
aaa
bbb
ccc
라는 세 개의 값이 전달된다.
파이썬에서는 프로그램을 실행할 때 전달되는 인수를 확인하기 위해
sys
모듈을 사용할 수 있다.
sys 모듈을 사용하려면 먼저 다음과 같이 작성한다.
import sys
기본 구조는 다음과 같다.
import sys
import는 다른 모듈의 기능을 현재 프로그램에서 사용하기 위해 불러오는 명령이다.
import sys
↓
sys 모듈 불러오기
sys에는 파이썬 실행 환경과 관련된 여러 기능이 들어 있으며, 이번에는 그중
sys.argv
를 사용한다.
sys.argv는 프로그램을 실행할 때 전달된 값들을 저장하고 있는 리스트이다.
예를 들어 test.py라는 파일에 다음 코드를 작성했다고 하자.
import sys
print(sys.argv)
그리고 명령 프롬프트에서
python test.py aaa bbb ccc
라고 실행한다.
그러면 sys.argv는 개념적으로 다음과 같다.
[
"test.py",
"aaa",
"bbb",
"ccc"
]
즉,
| 인덱스 | 값 |
|---|---|
sys.argv[0] | 실행한 파일 이름 |
sys.argv[1] | 첫 번째 인수 |
sys.argv[2] | 두 번째 인수 |
sys.argv[3] | 세 번째 인수 |
sys.argv[0]
에는 사용자가 전달한 첫 번째 값이 아니라 실행한 파이썬 파일 이름이 들어간다.
예를 들어
python sys1.py aaa bbb ccc
라면
sys.argv[0] → sys1.py
sys.argv[1] → aaa
sys.argv[2] → bbb
sys.argv[3] → ccc
이다.
그림으로 보면
python sys1.py aaa bbb ccc
↓ ↓ ↓ ↓
argv[0] ──┘ │ │ │
argv[1] ────────┘ │ │
argv[2] ────────────┘ │
argv[3] ────────────────┘
원문의 예제에서는 다음과 같이 작성한다.
args = sys.argv[1:]
왜 [1:]을 사용하는지 이해하는 것이 중요하다.
앞에서 살펴본 것처럼
sys.argv[0]
에는 프로그램 파일 이름이 들어간다.
예를 들어
sys.argv
가
["sys1.py", "aaa", "bbb", "ccc"]
라면
sys.argv[1:]
은 리스트 슬라이싱에 의해
["aaa", "bbb", "ccc"]
가 된다.
즉,
sys.argv
["sys1.py", "aaa", "bbb", "ccc"]
↑
제외
↓
sys.argv[1:]
["aaa", "bbb", "ccc"]
이다.
따라서
args = sys.argv[1:]
라고 작성하면 실제 사용자가 전달한 인수만 args에 저장할 수 있다.
다음 프로그램을 살펴보자.
# sys1.py
import sys
args = sys.argv[1:]
for i in args:
print(i)
코드를 하나씩 살펴보면
import sys
sys 모듈을 불러온다.
args = sys.argv[1:]
프로그램 파일 이름을 제외하고 사용자가 전달한 인수만 가져온다.
for i in args:
print(i)
args 리스트의 값을 하나씩 꺼내 출력한다.
Windows 명령 프롬프트에서 sys1.py가 저장된 폴더로 이동한다.
예를 들어
C:\doit
폴더에 저장했다면
cd C:\doit
로 이동한다.
그리고 다음과 같이 실행한다.
python sys1.py aaa bbb ccc
결과
aaa
bbb
ccc
이다.
먼저 사용자가
python sys1.py aaa bbb ccc
라고 입력한다.
그러면
sys.argv
는
["sys1.py", "aaa", "bbb", "ccc"]
가 된다.
그리고
args = sys.argv[1:]
에 의해
args = ["aaa", "bbb", "ccc"]
가 된다.
이후
for i in args:
가 실행된다.
i = "aaa"
출력
aaa
i = "bbb"
출력
bbb
i = "ccc"
출력
ccc
따라서 최종 결과는
aaa
bbb
ccc
이다.
이번에는 전달받은 모든 인수를 대문자로 변경하여 출력해 보자.
# sys2.py
import sys
args = sys.argv[1:]
for i in args:
print(i.upper(), end=" ")
앞부분은 기존 코드와 동일하다.
import sys
args = sys.argv[1:]
사용자가 전달한 인수를 가져온다.
새롭게 등장한 부분은
i.upper()
이다.
upper()는 문자열을 모두 대문자로 변경한다.
예를 들어
"python".upper()
결과
PYTHON
이다.
또한
print(i.upper(), end=" ")
에서
end=" "
를 사용하고 있다.
기본 print()는 출력 후 줄을 바꾼다.
print("A")
print("B")
결과
A
B
하지만
print("A", end=" ")
print("B", end=" ")
라고 작성하면
A B
처럼 한 줄로 출력된다.
따라서 이번 코드에서
print(i.upper(), end=" ")
는
문자열을 대문자로 바꾼 뒤 공백을 붙여 한 줄에 계속 출력한다.
라는 의미이다.
다음과 같이 실행한다고 해보자.
python sys2.py life is too short, you need python
sys.argv에는 다음과 같은 값들이 들어간다.
[
"sys2.py",
"life",
"is",
"too",
"short,",
"you",
"need",
"python"
]
sys.argv[1:]을 사용하면
[
"life",
"is",
"too",
"short,",
"you",
"need",
"python"
]
만 가져온다.
각 문자열에
upper()
를 적용하면
life → LIFE
is → IS
too → TOO
short, → SHORT,
you → YOU
need → NEED
python → PYTHON
이 된다.
따라서 최종 결과는
LIFE IS TOO SHORT, YOU NEED PYTHON
이다.
python sys2.py life is too short, you need python
↓
sys.argv
↓
["sys2.py", "life", "is", "too",
"short,", "you", "need", "python"]
↓
sys.argv[1:]
↓
["life", "is", "too",
"short,", "you", "need", "python"]
↓
for 문
↓
upper()
↓
LIFE IS TOO SHORT, YOU NEED PYTHON
앞에서 배운
input()
과 이번에 배운
sys.argv
는 둘 다 프로그램에 값을 전달할 수 있지만 사용 시점이 다르다.
name = input("이름을 입력하세요: ")
프로그램을 먼저 실행한 뒤 사용자에게 값을 입력받는다.
프로그램 실행
↓
입력 요청
↓
사용자가 입력
↓
프로그램 처리
예를 들어
python test.py
이름을 입력하세요: pingu
와 같은 방식이다.
sys.argv는 프로그램을 실행하는 순간 값을 함께 전달한다.
python test.py pingu
흐름은
프로그램 실행 + 값 전달
↓
프로그램 처리
이다.
| 구분 | input() | sys.argv |
|---|---|---|
| 입력 시점 | 프로그램 실행 중 | 프로그램 실행 시 |
| 입력 위치 | 프로그램 내부 입력창 | 명령 프롬프트 |
| 사용 방법 | input() | sys.argv |
| 여러 값 처리 | 직접 입력받아야 함 | 명령 뒤에 여러 인수 전달 가능 |
| 대표 용도 | 사용자와 상호작용 | 명령행 프로그램 |
예를 들어
name = input("이름: ")
실행
python test.py
이름: pingu
import sys
name = sys.argv[1]
실행
python test.py pingu
import sys
프로그램 실행 환경과 관련된 기능을 사용하기 위한 모듈이다.
이번 장에서는
sys.argv
를 사용한다.
프로그램 실행 시 전달된 인수들이 들어 있는 리스트이다.
python test.py A B C
이라면 개념적으로
sys.argv
는
["test.py", "A", "B", "C"]
이다.
sys.argv[0]
은 첫 번째 사용자 입력값이 아니다.
실행 중인 프로그램의 파일 이름이다.
python test.py aaa bbb
↓ ↓ ↓
argv[0] │ │
argv[1] ┘ │
argv[2] ────┘
실제 사용자가 입력한 인수만 얻고 싶다면
sys.argv[1:]
을 사용한다.
sys.argv
["test.py", "aaa", "bbb", "ccc"]
에서
sys.argv[1:]
을 사용하면
["aaa", "bbb", "ccc"]
가 된다.
즉,
[0] → 프로그램 파일명
[1:] → 사용자가 전달한 인수
라고 기억하면 쉽다.
sys.argv에 저장되는 값은 문자열이다.
예를 들어
python test.py 10 20
이라고 입력하더라도
sys.argv[1]
은 숫자 10이 아니라
"10"
이다.
따라서 숫자 계산을 하려면 형 변환해야 한다.
import sys
a = int(sys.argv[1])
b = int(sys.argv[2])
print(a + b)
실행
python test.py 10 20
결과
30
즉,
sys.argv[1]
↓
"10"
문자열
↓
int()
↓
10
정수
이다.
python calc.py 10 20
실행 시
sys.argv
는
["calc.py", "10", "20"]
이다.
따라서
sys.argv[0] → "calc.py"
sys.argv[1] → "10"
sys.argv[2] → "20"
이다.
그리고
sys.argv[1:]
은
["10", "20"]
가 된다.
💡 04-4에서는
sys.argv가 명령줄에서 전달받은 값을 저장하는 리스트라는 점과argv[0]에는 프로그램 파일 이름,argv[1:]에는 실제 전달한 인수들이 들어간다는 점을 확실하게 기억해 두자.