• 2020. 7. 3.

    by. 윈썸지니

    반응형

    출처 : pixabay

    지난 포스팅에서 명령행 인자 전달 방법으로 sys와 간단하게 argparse 사용법에 대해 알아보았습니다.

    본 포스팅에서 argparse 사용법에 대한 내용을 상세히 알아봅니다.

     

    지난 포스팅에 간단한 sys.argvargparse를 비교하는 글을 안 보신 분은 먼저 보고 오세요.

    파이썬에 대해서 어느정도 아시는 분은 안 보셔도 무관 합니다.

    [IT 이야기 공간/프로그램 언어 및 Database] - 파이썬(Python) 명령행 인자 전달 방법 – sys

     

    파이썬(Python) 명령행 인자 전달 방법 – sys

    지난 포스팅에서 함수에 대해 알아보았고 또한 인자 전달 방법에 대해 알아보았습니다. 이번 포스팅은 함수로 인자 전달하는 방법은 알았으나, 명령행(커맨드 라인)에서는 인자를 어떻게 전달��

    jinisbonusbook.tistory.com

    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 더하기 1013 입니다.

    도움말을 보여줍니다.

    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 1

    usage: add1.py [-h] N N

    add1.py: error: the following arguments are required: N


    C:\py_test>python add1.py 1 2 3

    usage: 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 라고 설정을 하여 인자를 2integers에 리스트 처럼 받았습니다.

     

    여러 개가 쓰일 경우 ‘?’, ‘+’, ‘*’ 등으로 리스트로 받을 수 있습니다.

    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 dbuserpw 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 일부 actionnargs 를 선택할 때 필요한 상숫값.
    • default 인자가 명령행에 없는 경우 기본으로 생성되는 값.
    • type 명령행 인자가 변환되어야 할 자료형. 기본은 문자열
    • choices 인자로 허용되는 값의 컨테이너.
    • required 명령행 옵션을 생략 할 수 있는지 아닌지 (선택적일 때만).
    • help 인자가 하는 일에 대한 간단한 설명.
    • metavar 사용 메시지( help)사용되는 인자의 이름.
    • dest parse_args() 가 반환하는 객체에 추가될 속성 이름.

    지금까지 argparse 사용법에 대해 알아보았습니다.

     

    파이썬은 많은 편리한 기능들을 모듈로 제공해 주기 때문에 코딩하기 편한 언어로 느껴집니다.

    반응형