Python의 명령줄 인수

살펴보기

Python은 매우 인기 있는 프로그래밍 언어일 뿐만 아니라 대부분의 운영 체제와 명령줄 인수 처리를 쉽게 해주는 많은 라이브러리를 지원하므로 다양한 목적을 위한 명령줄 도구를 만드는 데 널리 사용됩니다. 이러한 도구는 간단한 CLI 앱부터 AWS와 같이 더 복잡한 앱까지 다양합니다. awscli 도구입니다.

이와 같은 복잡한 도구는 일반적으로 다음을 통해 사용자가 제어합니다. 명령 줄 인수, 사용자가 특정 명령을 사용하고 옵션을 설정하는 등의 작업을 수행할 수 있습니다. 예를 들어, 이러한 옵션은 추가 정보를 출력하거나, 지정된 소스에서 데이터를 읽거나, 출력을 특정 위치로 보내도록 도구에 지시할 수 있습니다.

일반적으로 인수는 운영 체제에 따라 다르게 CLI 도구에 전달됩니다.

  • 유닉스 계열: - 다음과 같은 문자가 옵니다. -h-- 그 다음에는 다음과 같은 단어가 옵니다. --help
  • 윈도우 : / 그 뒤에 문자나 단어가 옵니다. /help

역사적 이유로 인해 이러한 다양한 접근 방식이 존재합니다. Unix 계열 시스템의 많은 프로그램은 단일 및 이중 대시 표기법을 모두 지원합니다. 단일 대시 표기법은 주로 단일 문자 옵션에 사용되는 반면, 이중 대시는 더 읽기 쉬운 옵션 목록을 제공하며, 이는 더 명확해야 하는 복잡한 옵션에 특히 유용합니다.

주의 사항: 이 기사에서는 Unix와 같은 형식의 파일에만 초점을 둘 것입니다. ---.

인수의 이름과 의미는 모두 프로그램에 따라 다르다는 점을 명심하십시오. 다음과 같은 몇 가지 일반적인 규칙 외에는 일반적인 정의가 없습니다. --help 도구 사용에 대한 자세한 내용은 Python 스크립트 개발자는 호출자에게 제공할 인수와 수행할 작업을 결정합니다. 이를 위해서는 적절한 평가가 필요합니다.

사용 가능한 인수 목록이 늘어남에 따라 이를 정확하게 구문 분석하려는 코드가 더욱 복잡해집니다. 운 좋게도 Python에는 이를 도와줄 수 있는 라이브러리가 많이 있습니다. 우리는 "스스로 할 수 있는 것"에서부터 sys.argv, "완료" 접근 방식으로 argparse.

Python으로 명령줄 인수 처리

Python 3+와 주변 생태계는 명령줄 인수를 처리하는 다양한 방법을 지원합니다. 있다 . 명령줄 인수 구문 분석을 촉진하는 라이브러리.

내장된 방법은 다음을 사용하는 것입니다. sys 기준 치수. 이름과 사용법 측면에서 C 라이브러리(libc).

두 번째 방법은 getopt 매개변수 값 평가를 포함하여 짧은 옵션과 긴 옵션을 모두 처리하는 모듈입니다.

XNUMXD덴탈의 인수 모듈, 이는 다음에서 파생됩니다. optparse 모듈(Python 2.7까지 사용 가능).

XNUMXD덴탈의 docopt 모듈은 GitHub에서 사용 가능, 또한 동일한 기능을 허용합니다.

최근 absl 도서관은 또한 대체 수단으로 인기를 얻고 있습니다. optparsegetopt().

이러한 각 방법에는 장단점이 있으므로 각 방법을 평가하여 귀하의 요구 사항에 가장 적합한 방법을 확인하는 것이 좋습니다.

sys 모듈

이것은 Python 초기부터 제공되었던 기본 모듈입니다. 다음을 사용하여 C 라이브러리와 매우 유사한 접근 방식을 취합니다. argc/argv 인수에 액세스합니다. 그만큼 sys 모듈 다음과 같은 간단한 목록 구조로 명령줄 인수를 구현합니다. sys.argv.

각 목록 요소는 단일 인수를 나타냅니다. 목록의 첫 번째 항목은 sys.argv[0]는 Python 스크립트의 이름입니다. 나머지 목록 요소는 sys.argv[1]sys.argv[n]는 명령줄 인수 2부터 n까지입니다.

인수 사이의 구분 기호로는 공백이 사용됩니다. 공백이 포함된 인수 값은 에서 올바르게 구문 분석하려면 따옴표로 묶어야 합니다. sys.

동등한 argc 목록에 있는 요소의 개수일 뿐입니다. 이 값을 얻으려면 Python을 사용하십시오. len() 운영자. 나중에 코드 예제에서 이를 보여드리겠습니다.

첫 번째 CLI 인수 인쇄

이 첫 번째 예에서는 스크립트가 호출되는 방식을 결정합니다. 이 정보는 0으로 색인된 첫 번째 명령줄 인수에 보관됩니다. 아래 코드는 Python 스크립트의 이름을 얻는 방법을 보여줍니다.

import sys

print("The script has the name %s" % (sys.argv[0])

이 코드를 다음 이름의 파일에 저장하세요. arguments-program-name.py를 누른 다음 아래와 같이 호출합니다. 출력은 다음과 같으며 전체 경로를 포함한 파일 이름을 포함합니다.

$ python arguments-program-name.py
The script has the name arguments-program-name.py
$ python /home/user/arguments-program-name.py
The script has the name /home/user/arguments-program-name.py

위의 두 번째 호출에서 볼 수 있듯이 Python 파일의 이름뿐만 아니라 이를 호출하는 데 사용된 전체 경로도 가져옵니다.

인수 수 계산

이 두 번째 예에서는 내장된 인수를 사용하여 명령줄 인수의 수를 간단히 계산합니다. len() 방법. sys.argv 우리가 조사해야 할 목록입니다. 아래 코드에서는 인수 수를 구한 다음 1을 뺍니다. 왜냐하면 해당 인수 중 하나(즉, 첫 번째 인수)가 항상 파일 이름으로 설정되어 있어 항상 유용하지는 않기 때문입니다. 따라서 사용자가 전달한 실제 인수 수는 다음과 같습니다. len(sys.argv) - 1:

import sys


arguments = len(sys.argv) - 1
print ("The script is called with %i arguments" % (arguments))

이 파일을 인수-count.py로 저장하고 이름을 지정합니다. 이 스크립트를 호출하는 몇 가지 예는 다음과 같습니다. 여기에는 세 가지 시나리오가 포함됩니다.

  • 추가 명령줄 인수가 없는 호출
  • 두 개의 인수가 있는 호출
  • 두 개의 인수가 있는 호출. 여기서 두 번째 인수는 공백이 포함된 따옴표 붙은 문자열입니다.
$ python arguments-count.py
The script is called with 0 arguments
$ python arguments-count.py --help me
The script is called with 2 arguments
$ python arguments-count.py --option "long string"
The script is called with 2 arguments
인수 반복

세 번째 예제는 프로그램 이름 자체를 제외하고 Python 스크립트로 전송된 모든 단일 인수를 출력합니다. 따라서 다음으로 시작하는 명령줄 인수를 반복합니다. 목록 요소. 목록은 Python에서 1 기반이므로 이것이 인덱스 0이라는 점을 기억하세요.

import sys


arguments = len(sys.argv) - 1


position = 1
while (arguments >= position):
    print ("Parameter %i: %s" % (position, sys.argv[position]))
    position = position + 1

아래에서는args-output.py 파일에 저장된 코드를 호출합니다. 이전 예제에서와 마찬가지로 출력에는 세 가지 다른 호출이 표시됩니다.

  • 인수 없는 호출
  • 두 개의 인수가 있는 호출
  • 두 개의 인수가 있는 호출. 여기서 두 번째 인수는 공백을 포함하는 따옴표 붙은 문자열입니다.
$ python arguments-output.py
$ python arguments-output.py --help me
Parameter 1: --help
Parameter 2: me
$ python arguments-output.py --option "long string"
Parameter 1: --option
Parameter 2: long string

인용된 문자열 예제를 보여주는 요점은 매개변수가 일반적으로 공백으로 구분된다는 것입니다. ...을 제외하면 따옴표로 둘러싸여 있습니다.

압세일 깃발(absl)

Abseil의 Flags 라이브러리는 분산 명령줄 인수를 사용하여 명령줄 인수를 프로덕션 환경으로 가져오기 위한 것입니다. 모듈이 명령줄 플래그를 사용하고 다른 모듈로 가져오는 경우 – 다른 모듈 플래그도 가져옵니다., 가져온 모듈로 전달하여 처리할 수 있습니다.

이렇게 하면 모듈 간에 공유되는 복잡한 명령줄 인수가 더 쉽고 덜 장황해집니다.

또한 라이브러리를 사용하면 인수의 기본값, 설명 및 데이터 유형을 정의할 수 있으므로 추가 확인 및 변환이 필요하지 않습니다.

from absl import flags
import sys


flags.DEFINE_string('name', 'User', 'The name of the user.')


FLAGS = flags.FLAGS
FLAGS(sys.argv)

print(f"Hello {FLAGS.name}!")

지원되는 데이터 유형은 다음과 같습니다.

  • DEFINE_integer()
  • DEFINE_string()
  • DEFINE_bool()
  • DEFINE_enum()
  • DEFINE_list()
  • DEFINE_float()

만큼 잘 DEFINE_multi_integer(), DEFINE_multi_string()DEFINE_multi_enum() 다중 인수 입력의 경우. 추가적으로 달리기 --help, --helpfull등은 기존 플래그와 해당 설명을 다른 형식으로 인쇄합니다.

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

또한 라이브러리를 사용하면 범위 측면에서 검증을 정의할 수 있습니다(예: 정수 기반 값). upper_bound or lower_bound 이는 허용되며 임의의 메서드를 실행하여 값을 확인합니다.

def validate_name(value):
    return len(value) > 15

flags.register_validator('name',
                         validate_name,
                         message='Name is over 15 characters long.',
                         flag_values=FLAGS)

이를 구체적인 예로 정리하면 다음과 같습니다.

from absl import flags
import sys

flags.DEFINE_string('name', 'User', 'The name of the user.')
flags.DEFINE_integer('tasks', 0, 'The number of tasks a user has.', lower_bound=0)

FLAGS = flags.FLAGS
FLAGS(sys.argv)

print(f"{FLAGS.name} has {FLAGS.tasks} tasks to work on.")
$ python flags.py --name=John --tasks=5
John has 5 tasks to work on.
$ python flags.py --name=John --tasks=-1

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/absl/flags/_flag.py", line 180, in _parse
    return self.parser.parse(argument)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/absl/flags/_argument_parser.py", line 168, in parse
    raise ValueError('%s is not %s' % (val, self.syntactic_help))
ValueError: -1 is not a non-negative integer
...

argparse 모듈

XNUMXD덴탈의 인수 모듈 Python 3.2부터 사용 가능했으며, optparse Python 2.7까지 존재하는 모듈입니다. Python 문서에는 API 설명과 모든 방법을 자세히 다루는 튜토리얼이 포함되어 있습니다.

이 모듈은 표준화된 출력을 갖춘 명령줄 인터페이스를 제공하는 반면, 이전 두 솔루션은 대부분의 작업을 사용자 손에 맡깁니다. argparse 짧은 스타일이나 긴 스타일로 이름을 확인하여 고정 인수와 선택적 인수를 확인할 수 있습니다. 기본 선택적 인수로 다음이 포함됩니다. -h, 긴 버전과 함께 --help. 이 인수에는 허용되는 인수를 설명하는 기본 도움말 메시지가 함께 제공됩니다.

아래 코드는 파서 초기화를 보여주고, 기본 호출과 도움말 메시지를 보여주는 아래 출력을 보여줍니다. 이전 예제에서 사용한 Python 호출과 달리 다음 예제에서는 Python 3을 사용한다는 점에 유의하세요.


import argparse


parser = argparse.ArgumentParser()
parser.parse_args()
$ python3 arguments-argparse-basic.py 
$ python3 arguments-argparse-basic.py -h
usage: arguments-argparse-basic.py [-h]

optional arguments:
  -h, --help  show this help message and exit
$ python3 arguments-argparse-basic.py --verbose
usage: arguments-argparse-basic.py [-h]
arguments-argparse-basic.py: error: unrecognized arguments: --verbose

다음 단계에서는 사용자를 위한 도움말 메시지에 맞춤 설명을 추가하겠습니다. 이런 방식으로 파서를 초기화하면 추가 텍스트가 허용됩니다. 아래 코드는 설명을 text 명시적으로 주어진 변수 argparse 수업을 description 매개변수. 아래에서 이 코드를 호출하면 출력이 어떻게 보이는지 확인할 수 있습니다.


import argparse


text = 'This is a test program. It demonstrates how to use the argparse module with a program description.'


parser = argparse.ArgumentParser(description=text)
parser.parse_args()
$ python3 arguments-argparse-description.py --help
usage: arguments-argparse-description.py [-h]

This is a test program. It demonstrates how to use the argparse module with a
program description.

optional arguments:
  -h, --help  show this help message and exit

마지막 단계로 다음과 같은 선택적 인수를 추가합니다. -V, 여기에는 해당하는 긴 스타일 인수가 있습니다. --version. 이를 위해 우리는 다음 방법을 사용합니다. add_argument() 세 개의 매개변수로 호출합니다(다음에 대해 표시됨). --version, 오직):

  • 매개변수 이름: --version
  • 매개변수에 대한 도움말 텍스트: help="show program version"
  • 작업(추가 값 없음): action="store_true"

해당 소스 코드는 아래에 표시됩니다. 라는 변수에 인수를 읽어 들입니다. args 을 통해 수행됩니다 parse_args() 의 방법 parser 물체. 한 번의 호출로 짧은 버전과 긴 버전을 모두 제출합니다. 마지막으로 속성이 args.V or args.version 버전 메시지가 설정되고 출력됩니다.


import argparse


parser = argparse.ArgumentParser()
parser.add_argument("-V", "--version", help="show program version", action="store_true")


args = parser.parse_args()


if args.version:
    print("This is myprogram version 0.1")
$ python3 arguments-argparse-optional.py -V
This is myprogram version 0.1
$ python3 arguments-argparse-optional.py --version
This is myprogram version 0.1

XNUMXD덴탈의 --version 인수에는 명령줄에 값을 제공할 필요가 없습니다. 이것이 바로 우리가 action 인수를 다음과 같이 설정한 이유입니다. "store_true". 다른 경우에는 특정 볼륨, 높이 또는 너비를 지정하는 경우와 같이 추가로 할당된 값이 필요할 수 있습니다. 이는 다음 예에 나와 있습니다. 기본적으로 모든 인수는 문자열로 해석됩니다.


import argparse


parser = argparse.ArgumentParser()


parser.add_argument("--width", "-w", help="set output width")


args = parser.parse_args()


if args.width:
    print("Set output width to %s" % args.width)

여기서는 다른 인수 값을 제출할 때 어떤 일이 발생하는지 보여줍니다. 여기에는 도움말 메시지뿐만 아니라 짧은 버전과 긴 버전이 모두 포함됩니다.

$ python3 arguments-argparse-optional2.py -w 10
Set output width to 10
$ python3 arguments-argparse-optional2.py --width 10
Set output width to 10
$ python3 arguments-argparse-optional2.py -h
usage: arguments-argparse-optional2.py [-h] [--width WIDTH]

optional arguments:
  -h, --help            show this help message and exit
  --width WIDTH, -w WIDTH
                        set output width

getopt 모듈

앞서 알아차렸을 수도 있듯이, sys 모듈은 명령줄 문자열을 단일 패싯으로만 분할합니다. 파이썬 getopt 모듈 조금 더 나아가 매개변수 검증을 통해 입력 문자열의 분리를 확장합니다. 를 기반으로 getopt C 함수에서는 값 할당을 포함하여 짧은 옵션과 긴 옵션을 모두 허용합니다.

실제로는 sys 입력 데이터를 올바르게 처리하는 모듈입니다. 그러기 위해서는 두 기관 모두 sys 모듈과 getopt 모듈을 미리 로드해야 합니다. 다음으로, 입력 매개변수 목록에서 첫 번째 목록 요소를 제거하고(아래 코드 참조) 명령줄 인수의 나머지 목록을 라는 변수에 저장합니다. argument_list:


import getopt, sys


full_cmd_arguments = sys.argv


argument_list = full_cmd_arguments[1:]

print argument_list

의 인수 argument_list 이제 다음을 사용하여 구문 분석할 수 있습니다. getopts() 방법. 하지만 그 전에 먼저 말해야 할 것이 있어요 getopts() 어떤 매개변수가 유효한지에 대해 그들은 다음과 같이 정의됩니다:

short_options = "ho:v"
long_options = ["help", "output=", "verbose"]

이는 이러한 주장이 몇 가지 추가 정보와 함께 유효하다고 간주되는 주장임을 의미합니다.

------------------------------------------
long argument   short argument  with value
------------------------------------------
--help           -h              no
--output         -o              yes
--verbose        -v              no
------------------------------------------

당신은 알아 차렸을 수도 있습니다 o 짧은 옵션은 콜론으로 시작되었습니다. :. 이것은 getopt 이 옵션에 값을 할당해야 합니다.

이제 인수 목록을 처리할 수 있습니다. 그만큼 getopt() 메소드에는 세 가지 매개변수를 구성해야 합니다. 즉, 실제 인수 목록입니다. argv, 유효한 짧은 옵션과 긴 옵션 모두(이전 코드 조각에 표시됨).

메서드 호출 자체는 평가 중 오류를 처리하기 위해 try-catch-statement에 보관됩니다. 이전에 정의된 목록의 일부가 아닌 인수가 발견되면 예외가 발생합니다. Python 스크립트는 오류 메시지를 화면에 인쇄하고 오류 코드 2로 종료됩니다.

try:
    arguments, values = getopt.getopt(argument_list, short_options, long_options)
except getopt.error as err:
    
    print (str(err))
    sys.exit(2)

마지막으로 해당 값이 포함된 인수는 이름이 지정된 두 변수에 저장됩니다. argumentsvalues. 이제 코드에서 이러한 변수를 쉽게 평가할 수 있습니다. 우리는 for-인식된 인수 목록을 다음 항목 다음에 한 항목씩 반복하는 루프입니다.


for current_argument, current_value in arguments:
    if current_argument in ("-v", "--verbose"):
        print ("Enabling verbose mode")
    elif current_argument in ("-h", "--help"):
        print ("Displaying help")
    elif current_argument in ("-o", "--output"):
        print (("Enabling special output mode (%s)") % (current_value))

아래에서 이 코드를 실행한 결과를 볼 수 있습니다. 프로그램이 유효한 프로그램 인수와 유효하지 않은 프로그램 인수에 어떻게 반응하는지 보여 드리겠습니다.

$ python arguments-getopt.py -h
Displaying help
$ python arguments-getopt.py --help
Displaying help
$ python arguments-getopt.py --output=green --help -v
Enabling special output mode (green)
Displaying help
Enabling verbose mode
$ python arguments-getopt.py -verbose
option -e not recognized

우리 프로그램에 대한 마지막 호출은 처음에는 약간 혼란스러워 보일 수 있습니다. 이를 이해하려면 단축 옵션(플래그라고도 함)을 단일 대시와 함께 사용할 수 있다는 점을 알아야 합니다. 이를 통해 도구에서 다양한 옵션을 더 쉽게 수용할 수 있습니다. 예를 들어, 전화 python arguments-getopt.py -vh 전화하는거랑 똑같네 python arguments-getopt.py -v -h. 따라서 위의 마지막 호출에서 getopt 모듈은 사용자가 통과하려고 한다고 생각했습니다. -e 옵션으로 유효하지 않습니다.

결론

이 기사에서는 다음을 포함하여 Python에서 명령줄 인수를 검색하는 다양한 방법을 보여주었습니다. sys, getoptargparse. 이러한 모듈은 기능이 다양하며 일부는 다른 것보다 훨씬 더 많은 기능을 제공합니다. sys 완전히 유연하지만 둘 다 getoptargparse 어떤 구조가 필요합니다. 대조적으로, 그들은 다음과 같은 복잡한 작업의 대부분을 다룹니다. sys 당신에게 달려있습니다. 제공된 예제를 통해 작업한 후에는 프로젝트에 가장 적합한 모듈을 결정할 수 있습니다.

이 기사에서는 다음과 같은 다른 솔루션에 대해서는 다루지 않았습니다. docopts 모듈, 방금 언급했습니다. 이 모듈은 완전히 다른 접근 방식을 따르며 다음 기사 중 하나에서 자세히 설명합니다.

참고자료

타임 스탬프 :

더보기 스택카부스