-
반응형
지난 포스팅에서 명령행 인자 전달 방법으로 sys와 간단하게 argparse 사용법에 대해 알아보았습니다.
본 포스팅에서 argparse 사용법에 대한 내용을 상세히 알아봅니다.
지난 포스팅에 간단한 sys.argv와 argparse를 비교하는 글을 안 보신 분은 먼저 보고 오세요.
파이썬에 대해서 어느정도 아시는 분은 안 보셔도 무관 합니다.
[IT 이야기 공간/프로그램 언어 및 Database] - 파이썬(Python) 명령행 인자 전달 방법 – sys
argparse 가 인자를 전달하는 방식이 있는데 먼저 위치로 인식하는 방법을 먼저 알아봅니다.
이전 포스팅에서 예로 들었던 2개의 수를 더하는 프로그램으로 이해를 돕기 위해 소스를 약간 변경했습니다.
import argparse
parser = argparse.ArgumentParser( description="인자는 2개의 숫자입니다" ) # 1번
parser.add_argument( 'num1', metavar='N', type=int, help='숫자로 입력하세요’) # 2번
parser.add_argument( 'num2', metavar='N', type=int, help='숫자로 입력하세요’) # 3번
args = parser.parse_args() # 4번
print( " %d 더하기 %d는 %d 입니다." % (args.num1, args.num2, args.num1+args.num2 )) # 5번실행 화면입니다.
C:\py_test>python add1.py 3 10
3 더하기 10는 13 입니다.
도움말을 보여줍니다.
C:\py_test>python add1.py --help
usage: add1.py [-h] N N
인자는 2개의 숫자입니다
positional arguments:
N 숫자로 입력하세요
N 숫자로 입력하세요
optional arguments:
-h, --help show this help message and exit
명령행에서 오류가 잘 발생되는지 확인을 위한 잘못된 인자를 입력해 봅니다.
C:\py_test>python add1.py a 3
usage: add1.py [-h] N N
add1.py: error: argument N: invalid int value: 'a'
C:\py_test>python add1.py 1usage: add1.py [-h] N N
add1.py: error: the following arguments are required: N
C:\py_test>python add1.py 1 2 3usage: add1.py [-h] N N
add1.py: error: unrecognized arguments: 3
위의 예제 소스는 위치기반으로 인식하는 방법입니다. 순서에 따라 인자가 할당됩니다.
1번인 argparse.ArgumentParser() 는 객체를 하나 생성합니다.
2,3 번은 인자를 추가 및 정의합니다.
4번은 파싱하여 결과값을 반환합니다.
즉, 위의 3개의 문구는 하나의 쌍으로 쓰여진다고 생각하시면 됩니다.
5번 파싱한 결과 값이 args에 전달이 되었고, 실제 args를 출력해 보면
Namespace(num1=1, num2=2) 이라고 출력이 됩니다.
각 값에 접근하려면 args.num1, args.num2 라고 접근하면 됩니다.
이전 포스팅에서는 인자를
parser.add_argument( 'integers', metavar='N', type=int, nargs=2, help='숫자로 입력하세요')
이렇게 정의하고 nargs 라는 파라메타 값에 2 라고 설정을 하여 인자를 2개 integers에 리스트 처럼 받았습니다.
여러 개가 쓰일 경우 ‘?’, ‘+’, ‘*’ 등으로 리스트로 받을 수 있습니다.
argsparse 를 사용하는 목적은 위치인자 보다는 옵션이 있는 인자를 받는 것이 소스가 훨씬 간편해지므로 사용합니다.
이제 옵션인자에 대해 알아봅니다.
물론 위치와 옵션인자를 같이 사용해도 됩니다.
먼저 예제를 하나 만들어서 설명하려고 합니다.
DB 정보를 명령행에서 입력 받아 DB 접속을 하려는 프로그램을 작성한다고 가정합니다.
본 프로그램은 DB 접속정보 받는 부분 까지만 코딩합니다.
db_connect.py라는 프로그램을 아래와 같이 작성합니다.
인자로는 접속 ip, port, db명, 계정명, 패스워드 를 입력 받는 것으로 예제를 작성하려고 합니다.
물론 패스워드는 암호화해서 보안에 위배되지 않도록 코딩 해야겠지만 지금은 argparse 사용법을 알아보려고하는 목적이므로 그냥 입력 값으로 전달 받는 것으로 예제를 작성합니다.
추후 암호와 예제도 포스팅 예정입니다.
db_connect.py -ip 호스트명(or IP) –p port -n DB명 –u DB사용자명 –pw 패스워드
예 : db_connect.py -h 10.10.10.101 –p 1521 -n testdb –u dbuser –pw password
import argparse
parser = argparse.ArgumentParser( description="DB 접속 정보" )
parser.add_argument( '-ip', metavar='ipaddress', help='호스트명 또는 ip를 입력')
parser.add_argument( '-p', metavar='port', type=int, help='DB 사용 port 입력')
parser.add_argument( ‘-name', '--n', help='DB명 입력’, required=True )
parser.add_argument( '-u', dest='user', help='DB 사용자 입력')
parser.add_argument( '-pw',help='DB 사용자 암호 입력')
args = parser.parse_args()
print( "ARGS :", args ) # args 를 출력해 봅니다.
print( "호스트명 :", args.ip ) # flag 명으로 접근합니다.
print( "Port번호 :", args.p )
print( "DB명 :", args.name ) # flag 명을 –n, -name 을 두개 주어서 마지막 flag 명으로 접근합니다.
print( "사용자명 :", args.user ) # 기본적으로 name 또는 flag명으로 접근하지만 dest= 라는 옵션을 주면 그 이름으로 접근 할 수 있습니다.
print( "패스워드 :", args.pw )
먼저 도움말을 확인해 봅니다.
아래에서 [ ] 가 있는 것이 있고 없는 것이 있습니다. [ ] 는 선택적인 항목으로 필수 항목이 아닙니다.
위에 소스에서 DB명만 required=True 라는 옵션을 사용하여 필수 항목으로 만들었습니다.
C:\py_test>python db_connect.py --help
usage: db_connect.py [-h] [-ip ipaddress] [-p port] -n NAME [-u USER] [-pw PW]
DB 접속 정보
optional arguments:
-h, --help show this help message and exit
-ip ipaddress 호스트명 또는 ip를 입력
-p port DB 사용 port 입력
-n NAME, --name NAME DB명 입력
-u USER DB 사용자 입력
-pw PW DB 사용자 암호 입력
명령행에서 인자를 모두 전달하여 결과를 확인합니다.
순서없이 옵션명이 맞으면 알아서 값을 찾아가는 것을 알 수 있습니다.
C:\py_test>python db_connect.py -ip 10.10.10.10 -p 1521 -u dbuser -pw password --name testdb
ARGS : Namespace(ip='10.10.10.10', name='testdb', p=1521, pw='password', user='dbuser')
호스트명 : 10.10.10.10
Port번호 : 1521
DB명 : testdb
사용자명 : dbuser
패스워드 : password
명령행에서 인자중 선택적인 옵션인 pw 를 입력하지 않았습니다.
오류 발생은 하지 않고 값만 None 으로 표현됩니다.
C:\py_test>python db_connect.py -ip 10.10.10.10 -p 1521 -u dbuser -n testdb
ARGS : Namespace(ip='10.10.10.10', name='testdb', p=1521, pw=None, user='dbuser')
호스트명 : 10.10.10.10
Port번호 : 1521
DB명 : testdb
사용자명 : dbuser
패스워드 : None
명령행에서 인자 중 필수 항목인 name( DB명)을 입력하지 않았습니다.
오류가 발생합니다.
C:\py_test>python db_connect.py -ip 10.10.10.10 -p 1521 -u dbuser -pw password
usage: db_connect.py [-h] [-ip ipaddress] [-p port] -n NAME [-u USER] [-pw PW]
db_connect.py: error: the following arguments are required: -n/--name
add_argument() 메소드에서 사용되는 옵션들을 알아봅니다.
예제에서 자주 사용되는 내용들을 알아보았고 자세한 내용은 파이썬에서 제공하는 매뉴얼을 참고해 주세요.
ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
- name or flags – 옵션 이름. 예를 들면 first_num, -n1 –number1
- action - 명령행에서 이 인자가 발견될 때 수행 할 액션의 기본형.
- nargs - 명령행 인자의 수 -> 숫자, ‘?’, ‘+’, ‘*’ 등이 올 수 있음.
- const – 일부 action 및 nargs 를 선택할 때 필요한 상숫값.
- default – 인자가 명령행에 없는 경우 기본으로 생성되는 값.
- type – 명령행 인자가 변환되어야 할 자료형. 기본은 문자열
- choices – 인자로 허용되는 값의 컨테이너.
- required – 명령행 옵션을 생략 할 수 있는지 아닌지 (선택적일 때만).
- help – 인자가 하는 일에 대한 간단한 설명.
- metavar – 사용 메시지( help)에 사용되는 인자의 이름.
- dest – parse_args() 가 반환하는 객체에 추가될 속성 이름.
지금까지 argparse 사용법에 대해 알아보았습니다.
파이썬은 많은 편리한 기능들을 모듈로 제공해 주기 때문에 코딩하기 편한 언어로 느껴집니다.
반응형'IT 이야기 공간 > 프로그램 언어' 카테고리의 다른 글
파이썬(Python) 파일 입출력 #2 읽기 (2) 2020.07.05 파이썬(Python) 파일 입출력 #1 열기 및 생성하기 (2) 2020.07.04 파이썬(Python) 명령행 인자 전달 방법 – sys (0) 2020.07.02 파이썬 함수 인자 전달시 변경되는 객체 – 리스트 등 (0) 2020.07.01 파이썬 전역(global)변수와 지역(local) 변수 (0) 2020.06.30