Руководство по 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/
Вернуться на верх