[module] argparse

markyang92·2021년 4월 23일
0

python

목록 보기
22/42
post-thumbnail

argparse

argparse.ArgumentParser()

  • importargparse
    • parser객체=argparse.ArgumentParser()
    • parser객체.add_argument(...)
  • 기본


description, epilog

  • parser=argparse.ArgumentParser(description=" ",epilog="%(prog)s")

객체.add_argument()

기본 추가 방법

  1. Short Option: '-<opt>'
parser = argparse.ArgumentParser()
parser.add_argument('-l', dest='length')
args = parser.parse_args()
pkg_dir = args.length
  1. Long Option: '--<option>'
parser = argparse.ArgumentParser()
parser.add_argument('-l','--length')
args = parser.parse_args()
pkg_dir = args.length
  1. Position Argment: 'Arg'
parser = argparse.ArgumentParser()
parser.add_argument('packagesdir')
args = parser.parse_args()
pkg_dir = args.packagesdir

help, type, required

  • 좀더 추가

action

action="count"

  • action="count": 이 옵션을 몇 번 했는지 세어라!
import argparse

def parsing():
    parser = argparse.ArgumentParser()
    parser.add_argument("-g", "--graph", help="create graph", action="count")
    
    args=parser.parse_args()
    print(args.graph)
    parser = argparse.ArgumentParser()
parser.add_argument('packagesdir')
args = parser.parse_args()
pkg_dir = args.packagesdir


action="store"

  • args.target에 Argument가 저장된다.

action="store_true"

  • action="store_true": 옵션이 지정되면 True를 대입하고 지정하지 않으면 False 를 대입
  • 예제


action="append", choices=[]

parser = argparse.ArgumentParser()
parser.add_argument('--checksum', action='append', dest='checksum', choices=['md5', 'sha256'])
args = parser.parse_args()
checksum = args.checksum if args.checksum else ['md5']

# ==== 출력 ==== #
usage: <prorgam> [--checksum {md5,sha256}]

default

import argparse

parser=argparse.ArgumentParser()
parser.add_argument('-G', help="app args 7", default=None)
args=parser.parse_args()
G = args.G == None if None else args.G

metavar

  • -h시, 위와 같이 표현된다.


nargs

  • nargs 키워드 인자는 다른 수의 명령행 인자를 하나의 액션으로 연결한다.
    • 정수: 명령행에서 정수 개의 인자를 모아서 리스트에 넣는다.
      parser = argparse.ArgumentParser()
      parser.add_argument('--foo', nargs=2)
      parser.add_argument('bar', nargs=1)
      parser.parse_args('c --foo a b'.split())
      Namespace(bar=['c'], foo=['a', 'b'])
      • nargs=1은 하나의 항목을 갖는 리스트를 생성한다.

  • ?. 가능하다면, 한 인자가 명령행에서 소비되고, 단일 항목으로 생성된다.
    명령행 인자가 없다면, default 값이 생성된다.
    선택 인자의 경우 추가적인 경우가 있다.
    - 옵션 문자열은 있지만, 명령행 인자가 따라붙지 않는 경우이다. 이 경우 const 값이 생성된다.
parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs='?', const='c', default='d')
parser.add_argument('bar', nargs='?', default='d')
parser.parse_args(['XX', '--foo', 'YY'])
Namespace(bar='XX', foo='YY')
parser.parse_args(['XX', '--foo'])
Namespace(bar='XX', foo='c')
Parser.parse_args([])
Namespace(bar='d', foo='d')
  • nargs='?' 의 흔한 사용법 중 하나는 선택적 입출력 파일을 허용하는 것입니다:
parser = argparse.ArgumentParser()
parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
                     default=sys.stdin)
parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
                     default=sys.stdout)
parser.parse_args(['input.txt', 'output.txt'])
Namespace(infile=<_io.TextIOWrapper name='input.txt' encoding='UTF-8'>,
          outfile=<_io.TextIOWrapper name='output.txt' encoding='UTF-8'>)
parser.parse_args([])
Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>,
          outfile=<_io.TextIOWrapper name='<stdout>' encoding='UTF-8'>)

  • *: 모든 명령행 인자를 리스트로 수집한다.
    일반적으로 두 개 이상의 위치 인자에 대해 nargs='*'를 사용하는 것은 별로 의미가 없지만,
    nargs='*'를 여러 개의 선택 인자는 가능하다.
parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs='*')
parser.add_argument('--bar', nargs='*')
parser.add_argument('baz', nargs='*')
parser.parse_args('a b --foo x y --bar 1 2'.split())
Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])


'+' '*' 와 같이, 존재하는 모든 명령행 인자를 리스트로 모읍니다. 또한, 적어도 하나의 명령행 인자가 제공되지 않으면 에러 메시지가 만들어집니다. 예를 들면:

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('foo', nargs='+')
parser.parse_args(['a', 'b'])
Namespace(foo=['a', 'b'])
parser.parse_args([])
usage: PROG [-h] foo [foo ...]
PROG: error: the following arguments are required: foo

nargs 키워드 인자가 제공되지 않으면, 소비되는 인자의 개수는 action 에 의해 결정됩니다. 일반적으로 이는 하나의 명령행 인자가 소비되고 하나의 항목(리스트가 아닙니다)이 생성됨을 의미합니다.


add_mutually_exclusive_group()

  • add_mutually_exclusive_group()
    • 서로 배타적인 옵션 지정시 사용
Usage: program [-v | -q] : -v나 -q 중 둘 중 하나만 사용
import argparse

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")

args=parser.parse_args()

  • args라는 Namespace에 자동으로 파싱된 args들이 담긴다.
    • --build-no 옵션의 Namespace가 args.build_no로 저장된다.

활용

#!/usr/bin/python3
import argparse

def parsing():
    parser = argparse.ArgumentParser()
    parser.add_argument("-s", "--scenario", help="Execute scenario", required=True)
    
    args = parser.parse_args()
    
    print(args.scenario)
    
if __name__ == "__main__" :
    parsing()

group을 활용하여, dry-run, required 중 하나 사용하기


객체.add_subparsers: 서브커맨드

import argparse

parser = argparse.ArgumentParser(description="OpenEmbedded pkgdata tool",\
					epilog="Use %(prog)s <subcommand> --help to get help on a specific command")
subparsers = parser.add_subparsers(title='subcommands', metavar='<subcommand>')



wic로 본 argparse

profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글