Руководство по argparse

Модуль argparse упрощает создание удобных интерфейсов командной строки. Он анализирует определенные аргументы из sys.argv.

Модуль argparse также автоматически генерирует справку и сообщения об использовании, а также выдает ошибки, когда пользователи предоставляют программе недопустимые аргументы.

Модуль argparse является стандартным модулем; нам не нужно его устанавливать.

Парсер создается с помощью ArgumentParser, а новый параметр добавляется с помощью add_argument(). Аргументы могут быть необязательными, обязательными или позиционными.

Python argparse необязательный аргумент

Следующий пример создает простой анализатор аргументов.

optional_arg.py

#!/usr/bin/env python

import argparse

# help flag provides flag help
# store_true actions stores argument as True

parser = argparse.ArgumentParser()
   
parser.add_argument('-o', '--output', action='store_true', 
    help="shows output")

args = parser.parse_args()

if args.output:
    print("This is some output")

В этом примере добавляется один аргумент с двумя параметрами: короткий -o и длинный --ouput. Это необязательные аргументы.

import argparse

Модуль импортирован.

parser.add_argument('-o', '--output', action='store_true', 
    help="shows output")

Аргумент добавляется с помощью add_argument(). action, для которого задано значение store_true, сохранит аргумент как True, если он присутствует. Опция справки дает справку по аргументам.

args = parser.parse_args()

Аргументы анализируются с помощью parse_args(). Проанализированные аргументы представлены как атрибуты объекта. В нашем случае это будет атрибут args.output.

if args.output:
    print("This is some output")

Если аргумент присутствует, мы покажем некоторый вывод.

$ optional_arg.py -o
This is some output
$ optional_arg.py --output
This is some output

Мы запускаем программу с параметрами -o и --output.

$ optional_arg.py --help
usage: optional_arg.py [-h] [-o]

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

Мы можем показать помощь программы.

Python argparse обязательный аргумент

Аргумент становится обязательным с опцией required.

required_arg.py

#!/usr/bin/env python

import argparse

# required arg

parser = argparse.ArgumentParser()
   
parser.add_argument('--name', required=True)

args = parser.parse_args()

print(f'Hello {args.name}')

В примере должна быть указана опция имени; в противном случае это не удается.

$ required_arg.py --name Peter
Hello Peter

$ required_arg.py
usage: required_arg.py [-h] --name NAME
required_arg.py: error: the following arguments are required: --name

Это вывод.

Python argparse позиционные аргументы

Следующий пример работает с позиционными аргументами. Они создаются с помощью add_argument().

positional_arg.py

#!/usr/bin/env python

import argparse

# positional args

parser = argparse.ArgumentParser()
   
parser.add_argument('name')
parser.add_argument('age')

args = parser.parse_args()

print(f'{args.name} is {args.age} years old')

Пример ожидает два позиционных аргумента: имя и возраст.

parser.add_argument('name')
parser.add_argument('age')

Позиционные аргументы создаются без символов префикса тире.

$ positional_arg.py Peter 23
Peter is 23 years old

Это пример вывода.

Python argparse dest

Опция dest функции add_argument() задает имя аргумента. Если он не указан, он выводится из опции.

dest.py

#!/usr/bin/env python

import argparse
import datetime

# dest gives a different name to a flag

parser = argparse.ArgumentParser()
   
parser.add_argument('-n', dest='now', action='store_true', help="shows now")

args = parser.parse_args()

# we can refer to the flag
# by a new name
if args.now:

    now = datetime.datetime.now()
    print(f"Now: {now}")

Программа присваивает имя now аргументу -n.

$ dest.py -n
Now: 2019-03-22 17:37:40.406571

Это вывод.

Тип argparse в Python

Аргумент type определяет тип аргумента.

rand_int.py

#!/usr/bin/env python

import argparse
import random

# type определяет тип аргумента

parser = argparse.ArgumentParser()
   
parser.add_argument('-n', type=int, required=True, 
    help="define the number of random integers")
args = parser.parse_args()

n = args.n

for i in range(n):
    print(random.randint(-100, 100))

Программа показывает n случайных целых чисел от -100 до 100.

parser.add_argument('-n', type=int, required=True, 
    help="define the number of random integers")

Опция -n предполагает целочисленное значение и является обязательной.

$ rand_int.py -n 3
92
-61
-61

Это пример вывода.

Python argparse по умолчанию

Опция default указывает значение по умолчанию, если значение не задано.

power.py

#!/usr/bin/env python

import argparse

# required определяет обязательный аргумент
# default определяет значение по умолчанию, если оно не указано

parser = argparse.ArgumentParser()

parser.add_argument('-b', type=int, required=True, help="defines the base value")
parser.add_argument('-e', type=int, default=2, help="defines the exponent value")
args = parser.parse_args()

val = 1

base = args.b
exp = args.e

for i in range(exp):
    val *= base

print(val)

Этот пример вычисляет экспоненту. Значение экспоненты не требуется; если оно не указано, то по умолчанию будет 2.

$ power.py -b 3
9
$ power.py -b 3 -e 3
27

Это вывод.

Python argparse metavar

Опция metavar задает имя для ожидаемого значения в выводах ошибок и справки.

metavar.py

#!/usr/bin/env python

import argparse

# metavar gives name to the expected value 
# in error and help outputs

parser = argparse.ArgumentParser()
   
parser.add_argument('-v', type=int, required=True, metavar='value', 
    help="computes cube for the given value")
args = parser.parse_args()

print(args)

val = args.v

print(val * val * val)

В примере ожидаемое значение называется value. Имя по умолчанию — V.

$ metavar.py -h
usage: metavar.py [-h] -v value

optional arguments:
  -h, --help  show this help message and exit
  -v value    computes cube for the given value

Данное имя отображается в выводе справки.

Действие добавления аргумента Python

Действие append позволяет группировать повторяющиеся параметры.

appending.py

#!/usr/bin/env python

import argparse

# действие добавления позволяет группировать повторяющиеся
# опции

parser = argparse.ArgumentParser()
   
parser.add_argument('-n', '--name', dest='names', action='append', 
    help="provides names to greet")

args = parser.parse_args()

names = args.names

for name in names:
    print(f'Hello {name}!')

В примере создаются приветственные сообщения для всех имен, указанных с помощью параметров n или name; они могут повторяться несколько раз.

$ appending.py -n Peter -n Lucy --name Jane
Hello Peter!
Hello Lucy!
Hello Jane!

Это вывод.

Python argparse nargs

nargs указывает количество аргументов командной строки, которые должны использоваться.

charseq.py

#!/usr/bin/env python

import argparse
import sys

# nargs устанавливает необходимое количество значений аргументов
# metavar дает имя значениям аргумента в выводе ошибки и справки

parser = argparse.ArgumentParser()
parser.add_argument('chars', type=str, nargs=2, metavar='c',
                    help='starting and ending character')

args = parser.parse_args()

try:
    v1 = ord(args.chars[0])
    v2 = ord(args.chars[1])

except TypeError as e:

    print('Error: arguments must be characters')
    parser.print_help()
    sys.exit(1)

if v1 > v2:
    print('first letter must precede the second in alphabet')
    parser.print_help()
    sys.exit(1)

Пример показывает последовательность символов от символа один до символа два. Он ожидает два аргумента.

parser.add_argument('chars', type=str, nargs=2, metavar='c',
    help='starting and ending character')

С помощью nargs=2 мы указываем, что ожидаем два аргумента.

$ charseq.py e k
e f g h i j k

В программе показана последовательность символов от e до k.

С помощью символа * можно задать переменное количество аргументов.

var_args.py

#!/usr/bin/env python

import argparse

# * nargs ожидает 0 или более аргументов

parser = argparse.ArgumentParser()
parser.add_argument('num', type=int, nargs='*')
args = parser.parse_args()

print(f"The sum of values is {sum(args.num)}")

В примере вычисляется сумма значений; мы можем указать переменное количество аргументов для программы.

$ var_args.py 1 2 3 4 5
The sum of values is 15

Это вывод.

Варианты argparse в Python

Опция choices ограничивает аргументы заданным списком.

mytime.py

#!/usr/bin/env python

import argparse
import datetime
import time

# choices limits argument values to the 
# given list

parser = argparse.ArgumentParser()

parser.add_argument('--now', dest='format', choices=['std', 'iso', 'unix', 'tz'],
                    help="shows datetime in given format")

args = parser.parse_args()
fmt = args.format

if fmt == 'std':
    print(datetime.date.today())
elif fmt == 'iso':
    print(datetime.datetime.now().isoformat())
elif fmt == 'unix':
    print(time.time())
elif fmt == 'tz':
    print(datetime.datetime.now(datetime.timezone.utc))

В примере параметр now может принимать следующие значения: std, iso, unix или tz.

$ mytime.py --now iso
2019-03-27T11:34:54.106643

$ mytime.py --now unix
1553682898.422863

Это пример вывода.

Пример головы

Следующий пример имитирует команду head в Linux. Он показывает n строк текста с начала файла.

words.txt

sky
top
forest
wood
lake
wood

Для примера у нас есть этот небольшой тестовый файл.

head.py

#!/usr/bin/env python

import argparse
from pathlib import Path

# head command
# working with positional arguments

parser = argparse.ArgumentParser()
   
parser.add_argument('f', type=str, help='file name')
parser.add_argument('n', type=int, help='show n lines from the top')

args = parser.parse_args()

filename = args.f

lines = Path(filename).read_text().splitlines()

for line in lines[:args.n]:
    print(line) 

В примере есть два параметра: f для имени файла и -n для количества отображаемых строк.

$ head.py words.txt 3
sky
top
forest

Это вывод.

Это был учебник Python argparse. Вас также могут заинтересовать учебник Python pathlib и учебник Python.

http://zetcode.com/python/argparse/

Вернуться на верх