[python] 명령 줄 인수를 구문 분석하는 가장 좋은 방법은 무엇입니까? [닫은]

무엇 쉬운 , tersest , 가장 유연한 파이썬 명령 줄 인수를 구문 분석 방법 또는 라이브러리는?



답변

이 답변은 optparse이전 Python 버전에 적합한 것을 제안 합니다. Python 2.7 이상에서는을 argparse대체합니다 optparse. 자세한 내용은 이 답변 을 참조하십시오.

다른 사람들이 지적했듯이 getopt보다 optparse를 사용하는 것이 좋습니다. getopt는 표준 getopt (3) C 라이브러리 함수의 일대일 맵핑이며 사용하기 쉽지 않습니다.

optparse는 조금 더 장황하지만 나중에 더 확장하기가 훨씬 더 체계적이고 단순합니다.

파서에 옵션을 추가하는 일반적인 라인은 다음과 같습니다.

parser.add_option('-q', '--query',
            action="store", dest="query",
            help="query string", default="spam")

그것은 거의 스스로를 말합니다. 처리시 -q 또는 –query를 옵션으로 승인하고 인수를 query라는 속성에 저장하며, 지정하지 않으면 기본값을 갖습니다. 또한 옵션을 사용하여 도움말 인수 (-h /-help와 함께 실행할 때 사용됨)를 선언한다는 자체 문서화도 있습니다.

보통 당신은 다음과 같이 논증을 파싱합니다 :

options, args = parser.parse_args()

기본적으로 스크립트에 전달 된 표준 인수 (sys.argv [1 :])를 구문 분석합니다.

options.query는 스크립트에 전달한 값으로 설정됩니다.

당신은 단순히 수행하여 파서를 만듭니다

parser = optparse.OptionParser()

이것들은 당신이 필요로하는 모든 기본 사항입니다. 다음은이를 보여주는 완전한 Python 스크립트입니다.

import optparse

parser = optparse.OptionParser()

parser.add_option('-q', '--query',
    action="store", dest="query",
    help="query string", default="spam")

options, args = parser.parse_args()

print 'Query string:', options.query

5 줄의 파이썬으로 기본 사항을 보여줍니다.

sample.py에 저장하고 다음으로 한 번 실행하십시오.

python sample.py

그리고 한번

python sample.py --query myquery

그 외에도 optparse는 확장하기가 매우 쉽다는 것을 알게 될 것입니다. 내 프로젝트 중 하나에서 명령 트리에 하위 명령을 쉽게 중첩시킬 수있는 Command 클래스를 만들었습니다. optparse를 많이 사용하여 명령을 함께 연결합니다. 몇 줄로 쉽게 설명 할 수는 없지만 주 클래스의 저장소 와 클래스 및 옵션 파서를 사용하는 클래스를 자유롭게 탐색 하십시오.


답변

argparse갈 길입니다. 사용 방법에 대한 간단한 요약은 다음과 같습니다.

1) 초기화

import argparse

# Instantiate the parser
parser = argparse.ArgumentParser(description='Optional app description')

2) 인수 추가

# Required positional argument
parser.add_argument('pos_arg', type=int,
                    help='A required integer positional argument')

# Optional positional argument
parser.add_argument('opt_pos_arg', type=int, nargs='?',
                    help='An optional integer positional argument')

# Optional argument
parser.add_argument('--opt_arg', type=int,
                    help='An optional integer argument')

# Switch
parser.add_argument('--switch', action='store_true',
                    help='A boolean switch')

3) 파싱

args = parser.parse_args()

4) 액세스

print("Argument values:")
print(args.pos_arg)
print(args.opt_pos_arg)
print(args.opt_arg)
print(args.switch)

5) 값 확인

if args.pos_arg > 10:
    parser.error("pos_arg cannot be larger than 10")

용법

올바른 사용법 :

$ ./app 1 2 --opt_arg 3 --switch

Argument values:
1
2
3
True

잘못된 주장 :

$ ./app foo 2 --opt_arg 3 --switch
usage: convert [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg]
app: error: argument pos_arg: invalid int value: 'foo'

$ ./app 11 2 --opt_arg 3
Argument values:
11
2
3
False
usage: app [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg]
convert: error: pos_arg cannot be larger than 10

전체 도움말 :

$ ./app -h

usage: app [-h] [--opt_arg OPT_ARG] [--switch] pos_arg [opt_pos_arg]

Optional app description

positional arguments:
  pos_arg            A required integer positional argument
  opt_pos_arg        An optional integer positional argument

optional arguments:
  -h, --help         show this help message and exit
  --opt_arg OPT_ARG  An optional integer argument
  --switch           A boolean switch


답변

docopt 사용

2012 년부터 docopt 라는 인수 구문 분석을위한 매우 쉽고 강력하며 멋진 모듈이 있습니다. 다음은 문서에서 가져온 예입니다.

"""Naval Fate.

Usage:
  naval_fate.py ship new <name>...
  naval_fate.py ship <name> move <x> <y> [--speed=<kn>]
  naval_fate.py ship shoot <x> <y>
  naval_fate.py mine (set|remove) <x> <y> [--moored | --drifting]
  naval_fate.py (-h | --help)
  naval_fate.py --version

Options:
  -h --help     Show this screen.
  --version     Show version.
  --speed=<kn>  Speed in knots [default: 10].
  --moored      Moored (anchored) mine.
  --drifting    Drifting mine.

"""
from docopt import docopt


if __name__ == '__main__':
    arguments = docopt(__doc__, version='Naval Fate 2.0')
    print(arguments)

이 그것입니다 그래서 : 코드의 2 개 라인 플러스 문서화 문자열 입니다 필수을하고 당신이 얻을 당신의 인수를 구문 분석하고 인수 객체에서 사용할 수 있습니다.

python-fire 사용

2017 년부터 python-fire 라는 또 다른 멋진 모듈이 있습니다. 그것은 당신이 일을 사용하여 코드에 대한 CLI 인터페이스를 생성 할 수 있습니다 제로 인수 구문 분석을. 다음은 설명서의 간단한 예입니다 (이 작은 프로그램은 double명령 줄에 기능 을 제공합니다 ).

import fire

class Calculator(object):

  def double(self, number):
    return 2 * number

if __name__ == '__main__':
  fire.Fire(Calculator)

명령 행에서 다음을 실행할 수 있습니다.

> calculator.py double 10
20
> calculator.py double --number=15
30


답변

새로운 엉덩이 방법입니다 argparse위해 이러한 이유. argparse> optparse> getopt

업데이트 : py2.7부터 argparse 는 표준 라이브러리의 일부이며 optparse 는 더 이상 사용되지 않습니다.


답변

클릭을 선호합니다 . 옵션 관리를 추상화하고 “(…) 필요한만큼 적은 코드로 구성 가능한 방식으로 멋진 명령 줄 인터페이스를 만들 수 있습니다”.

사용법 예는 다음과 같습니다.

import click

@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
              help='The person to greet.')
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times."""
    for x in range(count):
        click.echo('Hello %s!' % name)

if __name__ == '__main__':
    hello()

또한 멋진 형식의 도움말 페이지를 자동으로 생성합니다.

$ python hello.py --help
Usage: hello.py [OPTIONS]

  Simple program that greets NAME for a total of COUNT times.

Options:
  --count INTEGER  Number of greetings.
  --name TEXT      The person to greet.
  --help           Show this message and exit.


답변

거의 모든 사람들이 getopt를 사용하고 있습니다

이 문서의 예제 코드는 다음과 같습니다.

import getopt, sys

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
    except getopt.GetoptError:
        # print help information and exit:
        usage()
        sys.exit(2)
    output = None
    verbose = False
    for o, a in opts:
        if o == "-v":
            verbose = True
        if o in ("-h", "--help"):
            usage()
            sys.exit()
        if o in ("-o", "--output"):
            output = a

한마디로 여기에 그것이 작동하는 방법이 있습니다.

두 가지 유형의 옵션이 있습니다. 논쟁을 받고있는 사람들과 스위치와 같은 사람들.

sys.argv꽤 많은 당신을한다 char** argvC.처럼에서 당신은 당신의 프로그램 및 구문 분석만을 인수의 이름을 첫 번째 요소를 건너 C에서 :sys.argv[1:]

Getopt.getopt 당신이 주장하는 규칙에 따라 그것을 파싱 할 것입니다.

"ho:v"여기에 짧은 주장이 설명되어 -ONELETTER있습니다. :수단 -o하나 개의 인수를 받아들입니다.

마지막으로 ["help", "output="]긴 인수 ( --MORETHANONELETTER)를 설명 합니다. =후 출력은 다시 한 번 그 출력은 하나 개의 인수를 받아들이는 것을 의미한다.

결과는 커플 목록입니다 (옵션, 인수)

옵션이 --help여기 와 같은 인수를 허용하지 않으면 arg부분은 빈 문자열입니다. 그런 다음 일반적으로이 목록을 반복하고 예제와 같이 옵션 이름을 테스트하려고합니다.

이것이 도움이 되었기를 바랍니다.


답변

사용 optparse표준 라이브러리와 함께 제공됩니다. 예를 들면 다음과 같습니다.

#!/usr/bin/env python
import optparse

def main():
  p = optparse.OptionParser()
  p.add_option('--person', '-p', default="world")
  options, arguments = p.parse_args()
  print 'Hello %s' % options.person

if __name__ == '__main__':
  main()

소스 : Python을 사용하여 UNIX 명령 행 도구 작성

그러나 Python 2.7부터 optparse는 더 이상 사용되지 않습니다. optparse 대신 argparse를 사용하는 이유는 무엇입니까?