getopt 모듈 (스크립트의 매개변수 지정)
짠 스크립트를 명령어처럼 쓰는 경우가 많다.
이런 경우 내가 알고 내가 쓰면 상관없지만,
남이 이 스크립트를 쓰거나, 아니면 내가 다시 쓰는데 매개변수가 헷갈리는 경우
getopt 모듈을 찾게된 이유는 여기서 출발했다.
대부분의 스크립트로 된 명령어는 help 메세지를 표시한다.
또한 help 메세지와 같이 여러 옵션들이 존재하고 옵션마다 값을 지정해 준다.
예를들어 아래 ping 명령어 처럼
# ping -h Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline] [-p pattern] [-s packetsize] [-t ttl] [-I interface or address] [-M mtu discovery hint] [-S sndbuf] [ -T timestamp option ] [ -Q tos ] [hop1 ...] destination
|
배쉬 스크립트로 예전에 코드를 짤떄는
일일이 매개변수 따서 다 지정해주었는데
..........................................
.................
......
..
파이썬에서는 관련 모듈이 있었따!!!!
getopt 모듈
일단 아래 예제를 확인한다.
(필요에 의해 짜놓은 개인 코드 중 일부라 허접하다.)
import getopt - 중 략 - usage=""" Version : %s Usage: %s -i ip -n Service Name [-u username] [-p password] -i target host ip address -n Service Name -u target host id\t(default: root) -p target host pw\t(default: p4$$w0rd) -h print usage
Example: %s -i 192.168.1.124 -n RMS_RRM_8080 -u root -p p4$$w0rd """ % (VERSION, BASENAME, BASENAME) try: OptList, ArgList = getopt.getopt(sys.argv[1:], "hi:n:u:p:") except getopt.GetoptError, err: print "\n" + str(err) print usage sys.exit(1) if ((sys.argv[1] != "-h") and (len(sys.argv) < 3 )): print "\n !! Need to confirm argument !!\n\n" print usage sys.exit(1) for o, a in OptList: if o == '-h': print usage sys.exit(0) if o == '-i': target = a if o == '-u': ID = a if o == '-p': PASSWD = a if o == '-n': SERVICE_NAME = a
|
일단 getopt 모듈을 import하고
usage에 가장 원했던 help 메세지
실제로 try 구문 이하가 중요한데
OptList, ArgList = getopt.getopt(sys.argv[1:], "hi:n:u:p:") |
getopt.getopt() 함수가 두 개의 값을 리턴한다
해서 OptList, ArgList에 값을 넣는데
지어놓은 변수 이름에서 알 수 있듯이
먼저 받는 값은 옵션에 관련된 값, 뒤에 받는 값은 옵션아 아닌 순수한 인수(argument)이다.
예를 들어 ping 명령어에서
# ping -c 3 192.168.1.1
이라면
OptList에는 [ ('-c', '3') ]
ArgList에는 [ '192.168.1.1' ]
가 들어가게 된다.
다음에는 getopt.getopt() 함수에 들어가는 인수를 보자.
sys.argv[1:], "hi:n:u:p:"
입력받은 인수 문자열(sys.argv[1:])을 통으로 넣고
h, i, n, u, p의 옵션을 선언해준다.
그런데 h만 다른 옵션과 다르게 :(콜론)이 들어가지 않았다.
이는 옵션 값이 따로 없는 옵션이기 때문
이에 대한 규칙은 아래와 같다.
- 옵션 뒤에 추가 옵션이 없다. -> 단독으로 선언 (h) - 옵션 뒤에 추가 옵션이 있다. -> 옵션이 한 글자다. -> 옵션 뒤에 : (i:) -> 옵션이 두 글자 이상이다. -> 옵션 뒤에 = (option=) ** 긴 문자 옵션은 최초에 --로 받는다. ex) --option |
자 그 다음에는
받아놓은 옵션들을 세세하게 입맛대로 맞추어 본다.
for o, a in OptList: if o == '-h': print usage sys.exit(0) if o == '-i': target = a if o == '-u': ID = a if o == '-p': PASSWD = a if o == '-n': SERVICE_NAME = a |
보시다시피 OptList라는 리스트에 모두 들어있으며 각 쌍이 o, a에 들어가서
느낌 자체는 c의 case 문처럼 작성한다.
모든 일은 간지가 중요하다고
저렇게 명령어 help 메세지 및 옵션들을 막 만들어 놓으면
되게 막 잘 짠거 같고 완성도 있어 보인다.
자주 사용하게 되는 모듈이다.
이상
- 참고
http://kaspyx.tistory.com/69
https://docs.python.org/2/library/getopt.html
끝
'IT > Programing' 카테고리의 다른 글
언리얼엔진 무료 강좌 (0) | 2020.04.28 |
---|---|
[Bash Shell Script] tcpdump 패킷 저장 예제 (with signal) (0) | 2020.04.13 |
[잡] 프로그래밍 기도문 (0) | 2020.03.30 |
[Python] print format (0) | 2019.07.31 |
[Python] 문자열 줄바꿈 처리 (0) | 2019.07.24 |