저는 원래 C 프로그래머입니다. 나는 많은 다른 주장을 읽는 수많은 트릭과 "해킹"을 보았다.
파이썬 프로그래머가 할 수있는 몇 가지 방법은 무엇입니까?
저는 원래 C 프로그래머입니다. 나는 많은 다른 주장을 읽는 수많은 트릭과 "해킹"을 보았다.
파이썬 프로그래머가 할 수있는 몇 가지 방법은 무엇입니까?
답변:
표준 라이브러리의 표준 솔루션은 argparse
( docs )입니다.
예를 들면 다음과 같습니다.
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
지원 (다른 것들 중에서) :
optparse
더 이상 사용되지 않기 때문에 질문의 질문자는 더 이상 스택 오버플로의 구성원이 아니며 이것은 눈에 잘 띄는 질문에 대한 대답입니다 argparse
. 대신 stdlib를 사용하도록 예제 코드를 완전히 다시 작성하십시오 .
import sys
print("\n".join(sys.argv))
sys.argv
명령 행에서 스크립트에 전달 된 모든 인수를 포함하는 목록입니다.
원래,
import sys
print(sys.argv[1:])
sys.argv[1:]
(스크립트 이름은 피할 것입니다), 갈 길이 입니다.
이러한 이유 때문에 더 나은 argparse에 대한 복음화를 돌아 다니는 것 .. 본질적으로 :
(링크에서 복사)
argparse 모듈은 위치 및 선택적 인수를 처리 할 수있는 반면 optparse는 선택적 인수 만 처리 할 수 있습니다
argparse는 명령 행 인터페이스의 모양에 대해 독단적이지 않습니다. 필수 옵션 인 -file 또는 / file과 같은 옵션이 지원됩니다. Optparse는 실용성보다 순도를 선호하여 이러한 기능을 지원하지 않습니다.
argparse는 인수에서 결정된 명령 줄 사용법을 비롯하여보다 유용한 정보 메시지를 생성하고 위치 및 선택적 인수에 대한 도움말 메시지를 생성합니다. optparse 모듈은 자체 사용 문자열을 작성해야하며 위치 인수에 대한 도움말을 표시 할 방법이 없습니다.
argparse는 다양한 수의 명령 줄 인수를 사용하는 동작을 지원하는 반면, optparse는 정확한 수의 인수 (예 : 1, 2 또는 3)를 미리 알고 있어야합니다.
argparse는 하위 명령으로 디스패치하는 파서를 지원하는 반면 optparse allow_interspersed_args
는 파서 디스패치를 수동으로 설정
하고 수행해야합니다.
그리고 내 개인적인 마음에 드는 것 :
add_argument()
간단한 callables 로 type 및 action 매개 변수를 지정할 수 있지만 optparse는 해킹 클래스 속성과 같은 해킹 클래스 속성이 필요
STORE_ACTIONS
하거나 CHECK_METHODS
적절한 인수 검사가 필요합니다-f
또는 같은 옵션과 같은 인수로 지정된 인수를 의미 --foo
하는 반면, "정확한 수의 인수를 미리 알 수 있음"은 선행 옵션 플래그없이 주어진 위치 인수를 의미합니다.
또한이 argparse
다음 stdlib 모듈 (다음 stdlib의에서 "impovement" 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
docopt의 라이브러리는 정말 매끄러운입니다. 앱의 사용 문자열에서 인수 dict를 작성합니다.
예를 들어 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
다음과 같은 출력을 생성합니다.
제임스 스미스 안녕하세요
python main.py "James Smith"
하는 박았 James Smith
에 sys.argv[1]
와 생산 IndexError
이 존재하지 않는를 사용하려고하면 sys.argv[2]
. 인용 동작은 파이썬을 실행하는 플랫폼과 쉘에 따라 다소 다릅니다.
python main.py "James Joseph Smith"
할까요? 범위를 벗어난 인덱스에 관심이있는 경우 제공된 인수 수에 대한 검사를 추가 할 수 있습니다. 현실적이지 않은지, 내 예는 여러 인수를 처리하는 방법을 보여줍니다.
gmail-trash-msg.py MessageID
있습니다. 이 답변은 테스트 MessageID
매개 변수가 전달되었습니다 sys.argv[1]
.
나는 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"를 암시 적으로 만들기).
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
커맨드 라인 인수를보다 쉽게 처리하기 위해 작성한 작은 Python 모듈에 관심이있을 수 있습니다 (오픈 소스 및 무료) -Commando
또 다른 옵션은 argh 입니다. 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()
자동으로 도움말 등을 생성하며 데코레이터를 사용하여 arg-parsing 작동 방식에 대한 추가 지침을 제공 할 수 있습니다.
argh
것이 다른 라이브러리 나 사용하는 것보다 쉽습니다 sys
.
argh
들었지만 원한다면 하위 명령으로 명령을하지 않는 시나리오에는 적합하지 않습니다.
def frobnicate_spleches(...)
스크립트가 수행하는 모든 기능을 정의한 다음 if __name__ == '__main__': argh.dispatch_command(frobnicate_spleches)
파일 끝에서 수행하는 기능을 정의하는 것이 완벽하게 실현 가능해 보입니다 .
내 솔루션은 entrypoint2 입니다. 예:
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