IT/Programing

[Python] getopt (스크립트 매개변수 지정)

착한아줌마 2020. 4. 7. 23:13
반응형




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