무엇 쉬운 , 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** argv
C.처럼에서 당신은 당신의 프로그램 및 구문 분석만을 인수의 이름을 첫 번째 요소를 건너 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를 사용하는 이유는 무엇입니까?