[python] 명령 줄 인수를 읽고 처리하는 방법?



답변

표준 라이브러리의 표준 솔루션은 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 지원 (다른 것들 중에서) :

  • 어떤 순서로든 여러 옵션.
  • 짧고 긴 옵션.
  • 기본값.
  • 사용 도움말 메시지 생성

답변

import sys

print("\n".join(sys.argv))

sys.argv 명령 행에서 스크립트에 전달 된 모든 인수를 포함하는 목록입니다.

원래,

import sys
print(sys.argv[1:])


답변

이러한 이유 때문에 더 나은 argparse에 대한 복음화를 돌아 다니는 것 .. 본질적으로 :

(링크에서 복사)

  • argparse 모듈은 위치 및 선택적 인수를 처리 할 수있는 반면 optparse는 선택적 인수 만 처리 할 수 ​​있습니다

  • argparse는 명령 행 인터페이스의 모양에 대해 독단적이지 않습니다. 필수 옵션 인 -file 또는 / file과 같은 옵션이 지원됩니다. Optparse는 실용성보다 순도를 선호하여 이러한 기능을 지원하지 않습니다.

  • argparse는 인수에서 결정된 명령 줄 사용법을 비롯하여보다 유용한 정보 메시지를 생성하고 위치 및 선택적 인수에 대한 도움말 메시지를 생성합니다. optparse 모듈은 자체 사용 문자열을 작성해야하며 위치 인수에 대한 도움말을 표시 할 방법이 없습니다.

  • argparse는 다양한 수의 명령 줄 인수를 사용하는 동작을 지원하는 반면, optparse는 정확한 수의 인수 (예 : 1, 2 또는 3)를 미리 알고 있어야합니다.

  • argparse는 하위 명령으로 디스패치하는 파서를 지원하는 반면 optparse allow_interspersed_args는 파서 디스패치를 ​​수동으로 설정
    하고 수행해야합니다.

그리고 내 개인적인 마음에 드는 것 :

  • argparse를 사용하면 add_argument()
    간단한 callables 로 type 및 action 매개 변수를 지정할 수 있지만 optparse는 해킹 클래스 속성과 같은 해킹 클래스 속성이 필요
    STORE_ACTIONS하거나 CHECK_METHODS적절한 인수 검사가 필요합니다

답변

또한이 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


답변

한 가지 방법은을 사용하는 것 sys.argv입니다. 그러면 스크립트 이름이 첫 번째 인수로 전달되고 다른 모든 매개 변수가 전달됩니다.

import sys

for arg in sys.argv:
    print arg


답변

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

다음과 같은 출력을 생성합니다.

제임스 스미스 안녕하세요