수색…


소개

대부분의 명령 행 도구는 실행될 때 프로그램에 전달 된 인수에 의존합니다. 입력을 요구하는 대신,이 프로그램은 데이터 또는 특정 플래그 (부울이되는)가 설정 될 것으로 기대합니다. 이렇게하면 사용자와 다른 프로그램 모두 파이썬 파일을 실행하여 시작시 데이터를 전달할 수 있습니다. 이 절에서는 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__)


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow