명령줄 인수를 읽고 처리하는 방법은 무엇입니까?
-
06-07-2019 - |
문제
저는 원래 C 프로그래머입니다.나는 다양한 주장을 읽기 위한 수많은 트릭과 "해킹"을 보았습니다.
Python 프로그래머가 이를 수행할 수 있는 방법에는 어떤 것이 있습니까?
관련된
해결책
표준 라이브러리의 정식 솔루션은 다음과 같습니다. argparse
(문서):
예는 다음과 같습니다.
from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE")
parser.add_argument("-q", "--quiet",
action="store_false", dest="verbose", default=True,
help="don't print status messages to stdout")
args = parser.parse_args()
argparse
다음을 지원합니다:
- 순서에 상관없이 다양한 옵션이 제공됩니다.
- 짧고 긴 옵션.
- 기본값.
- 사용법 도움말 메시지 생성.
다른 팁
import sys
print("\n".join(sys.argv))
sys.argv
명령줄에서 스크립트에 전달된 모든 인수가 포함된 목록입니다.
원래,
import sys
print(sys.argv[1:])
그냥 전도하러 다니면서 인수 어느 것이 더 낫습니다 이것들 원인..본질적으로:
(링크에서 복사)
Argparse 모듈은 위치 및 선택적 인수를 처리 할 수 있지만 OptParse는 선택적인 인수 만 처리 할 수 있습니다.
Argparse는 명령 줄 인터페이스가 어떻게 보이는지에 대해 독단적이지 않습니다 - 필수 옵션과 같이 -file 또는 /file과 같은 옵션이 지원됩니다.OptParse는 이러한 기능을 지원하지 않고 실용성보다 순도를 선호합니다.
Argparse는 귀하의 인수에서 결정된 명령 줄 사용을 포함하여보다 유익한 사용 메시지를 생성하고 위치 및 선택적 인수 모두에 대한 메시지를 도와줍니다.OptParse 모듈은 자신의 사용 문자열을 작성해야하며 위치 인수에 대한 도움을 표시 할 방법이 없습니다.
Argparse는 가변 수의 명령 줄 아르를 소비하는 조치를 지원하는 반면 OptParse는 정확한 수의 인수를 요구합니다 (예 :1, 2 또는 3) 미리 알려진
Argparse는 하위 명령으로 파견되는 파서를 지원하는 반면 OptParse는 설정이 필요합니다.
allow_interspersed_args
그리고 파서 파견을 수동으로 파견합니다
그리고 제가 개인적으로 가장 좋아하는 것은:
- ArgParse는 유형 및 작업 매개 변수를 허용합니다
add_argument()
OptParse는 간단한 콜블블로 지정하려면 다음과 같은 해킹 클래스 속성이 필요합니다.STORE_ACTIONS
또는CHECK_METHODS
적절한 인수 점검을 받으려면
도 있습니다 argparse
stdlib 모듈 (stdlib의 "개선" optparse
기준 치수).예 argparse 소개:
# script.py
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument(
'integers', metavar='int', type=int, choices=range(10),
nargs='+', help='an integer in the range 0..9')
parser.add_argument(
'--sum', dest='accumulate', action='store_const', const=sum,
default=max, help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))
용법:
$ script.py 1 2 3 4
4
$ script.py --sum 1 2 3 4
10
이를 수행하는 한 가지 방법은 다음을 사용하는 것입니다. sys.argv
.그러면 스크립트 이름이 첫 번째 인수로 인쇄되고 여기에 전달되는 다른 모든 매개변수가 인쇄됩니다.
import sys
for arg in sys.argv:
print arg
그만큼 문서화하다 도서관은 정말 미끄러워요.앱의 사용 문자열에서 인수 사전을 작성합니다.
예를 들어 docopt readme에서:
"""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)
빠르고 유연하지 않은 것이 필요한 경우
main.py:
import sys
first_name = sys.argv[1]
last_name = sys.argv[2]
print("Hello " + first_name + " " + last_name)
그런 다음 실행 python main.py James Smith
다음 출력을 생성합니다.
안녕하세요 제임스 스미스
#set default args as -h , if no args:
if len(sys.argv) == 1: sys.argv[1:] = ["-h"]
나는 optparse를 직접 사용하지만 Simon Willison이 최근에 소개한 방향을 정말 좋아합니다. optfunc 도서관.다음과 같이 작동합니다.
"함수 정의 (인수 및 기본값 포함)를 내성하고이를 사용하여 명령 줄 인수 파서를 구성합니다."
예를 들어 다음 함수 정의는 다음과 같습니다.
def geocode(s, api_key='', geocoder='google', list_geocoders=False):
이 optparse 도움말 텍스트로 바뀌었습니다.
Options:
-h, --help show this help message and exit
-l, --list-geocoders
-a API_KEY, --api-key=API_KEY
-g GEOCODER, --geocoder=GEOCODER
나는 stdlib의 getopt를 좋아합니다. 예:
try:
opts, args = getopt.getopt(sys.argv[1:], 'h', ['help'])
except getopt.GetoptError, err:
usage(err)
for opt, arg in opts:
if opt in ('-h', '--help'):
usage()
if len(args) != 1:
usage("specify thing...")
최근에 나는 상황을 덜 장황하게 만들기 위해 이와 유사한 것을 포장했습니다(예:"-h"를 암시적으로 만듭니다).
명령줄 인수를 더욱 쉽게 처리하기 위해 제가 작성한 작은 Python 모듈에 관심이 있으실 수도 있습니다(오픈 소스 및 무료 사용). 특공대
나는 보는 것을 추천한다 문서화하다 다른 것들에 대한 간단한 대안으로.
docopt는 모든 것을 직접 구현하도록 요구하는 대신 --help 사용 메시지를 구문 분석하여 작동하는 새로운 프로젝트입니다.POSIX 형식으로 사용법 메시지를 입력하면 됩니다.
또 다른 옵션은 아아.argparse를 기반으로 하며 다음과 같은 내용을 작성할 수 있습니다.
import argh
# declaring:
def echo(text):
"Returns given word as is."
return text
def greet(name, greeting='Hello'):
"Greets the user with given name. The greeting is customizable."
return greeting + ', ' + name
# assembling:
parser = argh.ArghParser()
parser.add_commands([echo, greet])
# dispatching:
if __name__ == '__main__':
parser.dispatch()
도움말 등이 자동으로 생성되며 데코레이터를 사용하여 인수 구문 분석 작동 방식에 대한 추가 지침을 제공할 수 있습니다.
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))
Assuming the Python code above is saved into a file called prog.py
$ python prog.py -h
Ref-link: https://docs.python.org/3.3/library/argparse.html
내 솔루션은 진입점2.예:
from entrypoint2 import entrypoint
@entrypoint
def add(file, quiet=True):
''' This function writes report.
:param file: write report to FILE
:param quiet: don't print status messages to stdout
'''
print file,quiet
도움말 텍스트:
usage: report.py [-h] [-q] [--debug] file
This function writes report.
positional arguments:
file write report to FILE
optional arguments:
-h, --help show this help message and exit
-q, --quiet don't print status messages to stdout
--debug set logging level to DEBUG