Python Language
구문 분석 명령 줄 인수
수색…
소개
대부분의 명령 행 도구는 실행될 때 프로그램에 전달 된 인수에 의존합니다. 입력을 요구하는 대신,이 프로그램은 데이터 또는 특정 플래그 (부울이되는)가 설정 될 것으로 기대합니다. 이렇게하면 사용자와 다른 프로그램 모두 파이썬 파일을 실행하여 시작시 데이터를 전달할 수 있습니다. 이 절에서는 Python에서 명령 행 인수를 구현하고 사용하는 방법을 설명하고 설명합니다.
argparse의 Hello world
다음 프로그램은 사용자에게 인사를 전합니다. 사용자의 이름 인 하나의 위치 인수를 취하고 인사말을 들려줍니다.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('name',
help='name of user'
)
parser.add_argument('-g', '--greeting',
default='Hello',
help='optional alternate greeting'
)
args = parser.parse_args()
print("{greeting}, {name}!".format(
greeting=args.greeting,
name=args.name)
)
$ python hello.py --help
usage: hello.py [-h] [-g GREETING] name
positional arguments:
name name of user
optional arguments:
-h, --help show this help message and exit
-g GREETING, --greeting GREETING
optional alternate greeting
$ python hello.py world
Hello, world!
$ python hello.py John -g Howdy
Howdy, John!
자세한 내용은 argparse 문서 를 참조하십시오.
docopt를 사용한 기본 예제
docopt 는 머리에서 명령 행 인자 분석을 돌린다. 인수를 구문 분석하는 대신 프로그램 의 사용 문자열 을 작성 하고 docopt 는 사용 문자열을 구문 분석하고이를 사용 하여 명령 줄 인수를 추출합니다.
"""
Usage:
script_name.py [-a] [-b] <path>
Options:
-a Print all the things.
-b Get more bees into the path.
"""
from docopt import docopt
if __name__ == "__main__":
args = docopt(__doc__)
import pprint; pprint.pprint(args)
샘플 실행 :
$ python script_name.py
Usage:
script_name.py [-a] [-b] <path>
$ python script_name.py something
{'-a': False,
'-b': False,
'<path>': 'something'}
$ python script_name.py something -a
{'-a': True,
'-b': False,
'<path>': 'something'}
$ python script_name.py -b something -a
{'-a': True,
'-b': True,
'<path>': 'something'}
argparse로 상호 배타적 인 인수 설정하기
두 개 이상의 인수가 상호 배타적 인 경우. argparse.ArgumentParser.add_mutually_exclusive_group()
함수를 사용할 수 있습니다. 아래 예제에서 foo 또는 bar는 동시에 존재할 수 있지만 동시에 존재할 수는 없습니다.
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-f", "--foo")
group.add_argument("-b", "--bar")
args = parser.parse_args()
print "foo = ", args.foo
print "bar = ", args.bar
--foo
및 --bar
인수를 모두 지정하여 스크립트를 실행하려고하면 스크립트가 아래 메시지를 표시합니다.
error: argument -b/--bar: not allowed with argument -f/--foo
argv에 명령 행 인수 사용하기
명령 행에서 파이썬 스크립트가 호출 될 때마다 사용자는 추가 명령 행 인수 를 제공하여 스크립트로 전달할 수 있습니다. 이러한 인수는 시스템 변수에서 프로그래머로 사용할 수 있습니다 sys.argv
( "변수는 argv는"대부분의 프로그래밍 언어에서 사용되는 전통적인 이름이며, "인수 ument 브이 엑터"를 의미한다).
관습 적으로 sys.argv
목록의 첫 번째 요소는 Python 스크립트 자체의 이름이며 나머지 요소는 스크립트를 호출 할 때 사용자가 전달한 토큰입니다.
# cli.py
import sys
print(sys.argv)
$ python cli.py
=> ['cli.py']
$ python cli.py fizz
=> ['cli.py', 'fizz']
$ python cli.py fizz buzz
=> ['cli.py', 'fizz', 'buzz']
다음은 argv
를 사용하는 방법의 또 다른 예입니다. 먼저 sys.argv의 초기 요소를 제거합니다. 스크립트의 이름이 포함되어 있기 때문입니다. 그런 다음 나머지 인수를 하나의 문장으로 결합하고 마지막으로 현재 로그인 한 사용자의 이름 앞에 문장을 인쇄하여 채팅 프로그램을 에뮬레이트합니다.
import getpass
import sys
words = sys.argv[1:]
sentence = " ".join(words)
print("[%s] %s" % (getpass.getuser(), sentence))
많은 수의 비 위치 인수를 "수동으로"구문 분석 할 때 일반적으로 사용되는 알고리즘은 sys.argv
목록을 반복하는 것입니다. 한 가지 방법은 목록을 살펴보고 각 요소를 팝하는 것입니다.
# reverse and copy sys.argv
argv = reversed(sys.argv)
# extract the first element
arg = argv.pop()
# stop iterating when there's no more args to pop()
while len(argv) > 0:
if arg in ('-f', '--foo'):
print('seen foo!')
elif arg in ('-b', '--bar'):
print('seen bar!')
elif arg in ('-a', '--with-arg'):
arg = arg.pop()
print('seen value: {}'.format(arg))
# get the next value
arg = argv.pop()
argparse를 사용한 사용자 정의 파서 오류 메시지
스크립트 필요에 따라 파서 오류 메시지를 만들 수 있습니다. 이것은 argparse.ArgumentParser.error
함수를 통해 argparse.ArgumentParser.error
합니다. 아래의 예는 --foo
가 주어졌지만 --bar
stderr
사용법과 오류 메시지를 stderr
하는 스크립트를 보여줍니다.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-f", "--foo")
parser.add_argument("-b", "--bar")
args = parser.parse_args()
if args.foo and args.bar is None:
parser.error("--foo requires --bar. You did not specify bar.")
print "foo =", args.foo
print "bar =", args.bar
스크립트 이름이 sample.py라고 가정하고 다음을 실행합니다. python sample.py --foo ds_in_fridge
스크립트는 다음과 같이 불평 할 것입니다 :
usage: sample.py [-h] [-f FOO] [-b BAR]
sample.py: error: --foo requires --bar. You did not specify bar.
argparse.add_argument_group ()을 사용한 인수의 개념적 그룹화
argparse ArgumentParser ()를 생성하고 '-h'를 사용하여 프로그램을 실행하면 소프트웨어를 실행할 수있는 인수를 설명하는 자동화 된 사용법 메시지가 표시됩니다. 기본적으로 위치 인수와 조건 인수는 두 개의 범주로 구분됩니다. 예를 들어, 작은 스크립트 (example.py)와 python example.py -h
를 실행할 때의 출력이 있습니다.
import argparse
parser = argparse.ArgumentParser(description='Simple example')
parser.add_argument('name', help='Who to greet', default='World')
parser.add_argument('--bar_this')
parser.add_argument('--bar_that')
parser.add_argument('--foo_this')
parser.add_argument('--foo_that')
args = parser.parse_args()
usage: example.py [-h] [--bar_this BAR_THIS] [--bar_that BAR_THAT]
[--foo_this FOO_THIS] [--foo_that FOO_THAT]
name
Simple example
positional arguments:
name Who to greet
optional arguments:
-h, --help show this help message and exit
--bar_this BAR_THIS
--bar_that BAR_THAT
--foo_this FOO_THIS
--foo_that FOO_THAT
사용자를 돕기 위해 인수를 더 많은 개념 섹션으로 분리하려는 경우가 있습니다. 예를 들어, 모든 입력 옵션을 한 그룹에, 모든 출력 옵션을 다른 그룹에 지정할 수 있습니다. 위의 예제는 --foo_*
args를 --bar_*
args와 분리하여 조정할 수 있습니다.
import argparse
parser = argparse.ArgumentParser(description='Simple example')
parser.add_argument('name', help='Who to greet', default='World')
# Create two argument groups
foo_group = parser.add_argument_group(title='Foo options')
bar_group = parser.add_argument_group(title='Bar options')
# Add arguments to those groups
foo_group.add_argument('--bar_this')
foo_group.add_argument('--bar_that')
bar_group.add_argument('--foo_this')
bar_group.add_argument('--foo_that')
args = parser.parse_args()
python example.py -h
가 실행될 때이 출력을 생성합니다 :
usage: example.py [-h] [--bar_this BAR_THIS] [--bar_that BAR_THAT]
[--foo_this FOO_THIS] [--foo_that FOO_THAT]
name
Simple example
positional arguments:
name Who to greet
optional arguments:
-h, --help show this help message and exit
Foo options:
--bar_this BAR_THIS
--bar_that BAR_THAT
Bar options:
--foo_this FOO_THIS
--foo_that FOO_THAT
docopt 및 docopt_dispatch를 사용한 고급 예제
docopt와 마찬가지로, [docopt_dispatch]를 사용하여 엔트리 포인트 모듈의 __doc__
변수에 --help
을 만드는 법을 배웁니다. 거기에서, 파서를 파서를 실행시킬 수 있도록, 인자로서 doc 문자열을 사용하여 dispatch
를 호출합니다.
그것은 수동으로 인수를 처리하는 대신 (일반적으로 높은 순환주기 if / else 구조로 끝남), 인수 집합을 처리하는 방법 만 지정하여 전달하도록합니다.
이것은 dispatch.on
데코레이터가하는 것입니다. 함수를 트리거해야하는 인수 또는 인수 시퀀스를 지정하면 해당 함수가 일치하는 값을 매개 변수로 사용하여 실행됩니다.
"""Run something in development or production mode.
Usage: run.py --development <host> <port>
run.py --production <host> <port>
run.py items add <item>
run.py items delete <item>
"""
from docopt_dispatch import dispatch
@dispatch.on('--development')
def development(host, port, **kwargs):
print('in *development* mode')
@dispatch.on('--production')
def development(host, port, **kwargs):
print('in *production* mode')
@dispatch.on('items', 'add')
def items_add(item, **kwargs):
print('adding item...')
@dispatch.on('items', 'delete')
def items_delete(item, **kwargs):
print('deleting item...')
if __name__ == '__main__':
dispatch(__doc__)