— модуль Python, заменивший более старую версию похожего по функциональности модуля
argparseoptparse.
Назначение модуля — обработка опций и аргументов командной строки, с которой вызывается скрипт.
Модуль может не быть установлен вместе с Python:
# pydoc argparse no Python documentation found for 'argparse'
Поэтому его придётся установить вручную. Например, на CentOS:
# yum search argparse ... python-argparse.noarch : Optparse inspired command line parser for Python
# yum -y install python-argparse
Для FreeBSD:
# cd /usr/ports/ && make search name="argparse" Port: py27-argparse-1.2.1 Path: /usr/ports/devel/py-argparse Info: Optparse-inspired command-line parsing library Maint: [email protected] B-deps: gettext-0.18.3.1 libiconv-1.14_3 py27-setuptools27-2.0.1 python27-2.7.6_4 readline-6.3.3_1 R-deps: gettext-0.18.3.1 libiconv-1.14_3 py27-setuptools27-2.0.1 python27-2.7.6_4 readline-6.3.3_1 WWW: http://code.google.com/p/argparse/
# cd /usr/ports/devel/py-argparse && make install clean
Либо — установить с помощью pip или вручную.
Файл модуля во FreeBSD расположен в /usr/local/lib/python2.7/argparse.py, в CentOS — /usr/lib/python2.6/site-packages/argparse.py.
Для BASH есть аналогичный модуль getopts.
Для первого примера возьмём скрипт с таким содержимым:
#!/usr/bin/env python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-1', '--one' , help='This will be option One')
parser.parse_args()
Результат его запуска:
$ ./args.py -h usage: args.py [-h] [-1 ONE]
optional arguments: -h, --help show this help message and exit -1 ONE, --one ONE This will be option One
Заметьте, что опция -h (или --help) в нём не задаётся вручную, она обрабатывается модулем «автоматически» (хотя это можно переназначить).
Основные действия будут выполнятся классом ArgumentParser модуля argparse.
Список методов класса можно получить так:
>>> for i in dir(argparse.ArgumentParser):
... if not i.startswith('_'):
... print i
...
add_argument
add_argument_group
add_mutually_exclusive_group
add_subparsers
convert_arg_line_to_args
error
exit
format_help
format_usage
format_version
get_default
parse_args
parse_known_args
print_help
print_usage
print_version
register
set_defaults
Мы рассмотрим использование двух — add_argument и parse_args.
Содержание
Python argparse — добавление опций с помощью add_argument
Ситаксис add_argument:
add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
name или flags — имя опции, например foo или -f, —foo
action — тип действия, которое будет выполнятся при вызове опции (см. ниже action='store');
nargs — количество аргументов к опции, которые могут (должны) быть использованы;
const — константа, может потребовать некоторым типам действий или аргументам;
default — действие по-умолчанию, если опция пропущена (не вызвана), прмиеняется ко всем опциям, которым не назначен отдельный ключ default;
type — тип данных, в котором должен быть сохранён объект (данные), переданные аргументом к опции, например — str или int;
choices — контейнер допустимых значений для аргумента;
required — указатель, является ли опция обязательной;
help — краткое описание опции, используется в --help;
metavar — имя аргумента для опции, которое будет выводится в --help;
dest — имя опции, которое будет передано методу parse_args().
Тут отдельно надо остановиться на ключе «action«.
Ключ action может принимать такие значения:
'store'— просто сохраняет в переменной «имя_опции» значение, переданное опции (действие по-умолчанию);'store_const'— сохраняет значение, заданное ключёмconst;или'store_true''store_false'— сохраняет значение True или False;'count'— счётчик количества экземпляров опции.
Больше значений смотрите тут>>>.
Рассмотрим несколько примеров добавления обрабатываемых опций.
add_argument — name или flags
Опции, задаваемые со знаком «-» будут считаться опциональными, тогда как заданные просто в виде "имя" — обязательными.
Например:
#!/usr/bin/env python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-1', '--one', help='This will be option One')
parser.add_argument('two', help='This will be option two')
parser.add_argument('three', help='This will be option three')
print parser.parse_args()
Обратите внимание — тут мы добавили функцию print(), для вывода «пространства имён» опций.
Вызовем скрипт с опцией --help:
$ ./args.py -h usage: args.py [-h] [-1 ONE] two three positional arguments: two This will be option two three This will be option three optional arguments: -h, --help show this help message and exit -1 ONE, --one ONE This will be option One
Теперь — попробуем запустить скрипт с указанием всех опций:
$ ./args.py -1 first one two Namespace(one='first', three='two', two='one')
Т.к. для опции -1 не указано действие — будет выполнено действие по-умолчанию action='store'. Для позиционных опций не требуется указание аргументов, т.к. его значение само по себе будет явятся аргументом.
Например — вызов опции --one (или -1) без указания аргумента вызовет ошибку:
$ ./args.py one two -1 usage: args.py [-h] [-1 ONE] two three args.py: error: argument -1/--one: expected one argument
При этом — к вызову обязательны все позиционные опции, иначе будет ошибка:
$ ./args.py one -1 first usage: args.py [-h] [-1 ONE] two three args.py: error: too few arguments
add_argument — action
Рассмотрим допустимые действия для опций.
‘store’ — сохраняет значение, переданное опции (действие по-умолчанию)
Т.е., опции обязательно передать аргумент, который будет сохранён как её значение.
Например:
#!/usr/bin/env python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-1', '--one', help='This will be option One')
print parser.parse_args()
Будет аналогичен такому коду:
parser.add_argument('-1', '--one', action='store', help='This will be option One')
Результат выполнения:
$ ./args.py --one first_argument Namespace(one='first_argument')
‘store_const’ — сохраняет значение, заданное ключём const;
Изменим наш код:
parser.add_argument(‘-1’, ‘—one’, action=’store_const’, const=’1′, help=’This will be option One’)
$ ./args.py --one Namespace(one='1')
Удобно использовать для передачи различных флагов.
Например:
#!/usr/bin/env python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-1', '--one', action='store_const', const='1', help='This will be option One')
print parser.parse_args()
if parser.parse_args().one == '1':
print 'That's it!'
else:
print 'Here is nothing :-('
Вызовем скрипт с опцией --one:
$ ./args.py --one Namespace(one='1') That's it!
И без неё:
$ ./args.py Namespace(one=None) Here is nothing :-(
‘store_true’ или ‘store_false’ — сохраняет значение True или False
Похож по действию на store_const, с той разницей что хранит только True или False.
Изменим код:
parser.add_argument('-1', '--one', action='store_true', help='This will be option One')
Результат:
$ ./args.py -1 Namespace(one=True)
Тогда как вызов без опции --one задаст значение False:
$ ./args.py Namespace(one=False)
И наоборот:
parser.add_argument('-1', '--one', action='store_false', help='This will be option One')
$ ./args.py -1 Namespace(one=False)
И без опции:
$ ./args.py Namespace(one=True)
Соответственно — можем использовать код:
#!/usr/bin/env python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-1', '--one', action='store_true', help='This will be option One')
print parser.parse_args()
res = parser.parse_args()
if res.one:
print 'First is True!'
else:
print 'First is nothing :-('
Обратите внимание, что тут мы создали объект res, который является экземпляром класса argparse с вызовом метода ArgumentParser — просто, что бы не писать лишний текст.
Результат выполнения:
$ ./args.py -1 Namespace(one=True) First is True!
И без опции:
$ ./args.py Namespace(one=False) First is nothing :-(
‘count’ — счётчик количества экземпляров опции
Изменим наш код:
parser.add_argument('-1', '--one', action='count', help='This will be option One')
И вызовем его с одним ключём:
$ ./args.py -1 Namespace(one=1)
Или двумя:
$ ./args.py -11 Namespace(one=2)
Пример использования — указать уровень «подробности» режима verbosity, когда можно указать -v, -vv или -vvv.
add_argument — nargs
Ключ nargs поддерживает такие значения:
N— количество аргументов к опции;?— если присутствует один аргумент — он будет сохранён, иначе — будет использовано значение из ключаdefault;*— все переданные аргументы будут сохранены в один список;+— то же, что и*— но если нет хотя бы одного аргумента — будет выдано сообщение об ошибке;
nargs с N-аргументов:
Пример кода:
parser.add_argument('-1', '--one', nargs=2, help='This will be option One')
Обратите внимание, что тут 2 указывается без кавычек — иначе интерпретатор будет рассматривать значение как string (строку), что вызовет ошибку.
Если вызвать без указания аргументов к опции -1 — будет выдано сообщение об ошибке:
$ ./args.py -1 usage: args.py [-h] [-1 ONE ONE] args.py: error: argument -1/--one: expected 2 argument(s)
Вызываем с двумя аргументами — и получаем список:
$ ./args.py -1 one two Namespace(one=['one', 'two'])
nargs с «?» аргументов:
parser.add_argument('-1', '--one', nargs='?', help='This will be option One')
$ ./args.py -1 first Namespace(one='first')
Или передать имя файла:
$ ./args.py -1 file.txt Namespace(one='file.txt')
При вызове без аргумента — значение переменной будет задано как None:
$ ./args.py -1 Namespace(one=None)
Изменить это можно с помощью ключей const и default.
Немного изменим наш код:
parser.add_argument('-1', '--one', nargs='?', const='const-one', default='default-one', help='This will be option One')
parser.add_argument('-2', '--two', nargs='?', const='const-two', default='default-two', help='This will be option Two')
И результаты:
$ ./args.py -1 -2 Namespace(one='const-one', two='const-two')
$ ./args.py -1 first -2 Namespace(one='first', two='const-two')
$ ./args.py -1 first -2 second Namespace(one='first', two='second')
nargs с «*» аргументов:
Изменим пример:
parser.add_argument('-1', '--one', nargs='*', help='This will be option One')
При вызове без аргументов опции — создаст пустой список:
$ ./args.py -1 one two three Namespace(one=['one', 'two', 'three'])
При вызове с любым количеством аргументов — добавит их все в один список:
$ ./args.py -1 one two three Namespace(one=['one', 'two', 'three'])
Далее со списком можно выполнять любые стандартные операции:
#!/usr/bin/env python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-1', '--one', nargs='*', help='This will be option One')
print parser.parse_args()
res = parser.parse_args()
for i in res.one:
print i
И результат:
$ ./args.py -1 one two three Namespace(one=['one', 'two', 'three']) one two three
nargs с «+» аргументов:
Требуется наличие хотя бы одного аргумента к опции.
Напрмиер:
parser.add_argument('-1', '--one', nargs='+', help='This will be option One')
Вызов без аргумента:
$ ./args.py -1 usage: args.py [-h] [-1 ONE [ONE ...]] args.py: error: argument -1/--one: expected at least one argument
С одним аргументом:
$ ./args.py -1 one Namespace(one=['one'])
Несколькими:
$ ./args.py -1 one two three Namespace(one=['one', 'two', 'three'])
add_argument — choices
Т.к. мы кратко рассмотрели const и default выше — то пропустим их, и перейдём к слудющему ключу — choices.
Изменим пример:
parser.add_argument('-1', '--one', choices=['1', '2', '3'], help='This will be option One')
В результате — аргумент к опции должен быть только из предложенного списка:
$ ./args.py -1 one two three
usage: args.py [-h] [-1 {1,2,3}]
args.py: error: argument -1/--one: invalid choice: 'one' (choose from 1, 2, 3)
Правильный выбор:
$ ./args.py -1 1 Namespace(one='1') 1
add_argument — required
Указание является ли опция обязательной:
parser.add_argument('-1', '--one', required=True, help='This will be option One')
$ ./args.py usage: args.py [-h] -1 ONE args.py: error: argument -1/--one is required
$ ./args.py -1 1 Namespace(one='1') 1
add_argument — dest
Замена имени переменной. По-умолчанию — имя переменной формируется из «длинного имени» опции (если есть, в нашем примере это --one), или из «короткого» (если нет «длинного», в нашем примере это -1):
parser.add_argument('-1', '--one', help='This will be option One')
$ ./args.py -1 one Namespace(one='one')
parser.add_argument('-1', help='This will be option One')
$ ./args.py -1 one Namespace(1='one')
Зададим другое имя:
parser.add_argument('-1', '--one', dest='firstvar', help='This will be option One')
Результат:
$ ./args.py -1 one Namespace(firstvar='one')
Что бы проверить, что скрипт вызван хотя бы с одной опцией — можно использовать такой способ:
#!/usr/bin/env python
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument('-1', '--one', dest='firstvar', help='This will be option One')
if len(sys.argv) == 1:
print 'nERROR! You must specify at least one option.n'
parser.print_help()
И вызовем скрипт без опций:
$ ./args.py
ERROR! You must specify at least one option.
usage: args.py [-h] [-1 FIRSTVAR]
optional arguments:
-h, --help show this help message and exit
-1 FIRSTVAR, --one FIRSTVAR
This will be option One
На этом, пожалуй, всё.
Ссылки по теме:
https://docs.python.org
https://docs.python.org
http://habrahabr.ru/post/144416/
http://sakalr.blogspot.com




