Error unrecognized arguments python

Python argparse Unrecognized Arguments

This article will cover two things: a quick example of how argparse is used and why we get the “Unrecognized Arguments” error (and how to solve it).

We will use the work_through_args.py script with the following contents to demonstrate concepts.

The script accepts three arguments – a positional argument, -v2/–value2, -v3/–value3, and -v4/–value4.

If we want to execute the above script from the command line, we need to run a command line this

See examples in the Figure below.

What Causes “Unrecognized Arguments” Error

This error is raised when we pass arguments that argparse does not expect. Here are some cases when this happens,

Case 1: Issuing argument that is not expected by argparse

The script above expected the arguments -v2/–value2, -v3/–value3 and -v4/–value4 NOT –value5. That is why the error was raised.

Case 2: Passing a value to an argument that does not expect the value

Some arguments do not expect the value to be passed to them. For example, -v4 in the above script does not expect any value to be supplied, and if we do, we end with an “Unrecognized Arguments” Error.

The argument -v4 already stores a value (True, if supplied; otherwise, False). That means -v4 does not accept any value, and attempts to give 56 as a value ended in error.

Solving “Unrecognized Arguments” Error

Solution 1: Verify that you are passing valid arguments

For Case 1 above – you need to pass arguments expected by argparse.

For Case 2 above – do not pass values to arguments that do not accept them.

Solution 2: Using the parser.parse_known_args() instead of parser.parse_args()

Unlike the parser.parse_args() function, parser.parse_known_args() accepts extra arguments. Here is an excerpt about it from the argparse documentation.

“Sometimes a script may only parse a few of the command-line arguments, passing the remaining arguments on to another script or program. In these cases, the parse_known_args() method can be useful. It works much like parse_args() except that it does not produce an error when extra arguments are present. Instead, it returns a two-item tuple containing the populated namespace and the list of remaining argument strings.” – Source: argparse documentation.

Читайте также:  Java or ruby on rails

To use parse_known_args() in our work_through_args.py script replace the lines

Источник

Разбор параметров командной строки в Python

Разбор параметров командной строки в Python

При создании консольных программ в Python очень часто необходимо разобрать параметры (аргументы) передаваемые через командную строку, это можно сделать используя переменную argv из модуля sys, а так же с помощью модуля argparse из стандартной библиотеки Pyhton.

Второй способ более предпочтительный и удобный, далее ему мы уделим больше внимания.

Статья ниже не является полным описание всех возможностей модуля argparse, это просто общий обзор.

Ниже я иногда пишу аргументы командной строки, иногда параметры командной строки… Имеется ввиду одно и тоже 🙂

Получение параметров без использования argparse

Например, мы хотим написать программу после запуска выводящую в консоль «Привет ». Имя мы будем передавать через параметр в командной строке, далее его нужно получить в нашей программе. Как это сделать?

Мы можем сделать это используя стандартный модуль sys и его переменную argv, она содержит список переданных параметров (нулевой элемент списка содержит имя нашего скрипта).

Другими словами, чтобы вывести имя, которое мы передаем аргументом, необходимо обратиться к sys.argv[1]:

Сохраним код в файле hello.py и запустим его с параметром «Александр» (аргументом):

Но если попытаться запустить скрипт без параметра, то получаем ошибку поскольку в списке нет элемента с индексом 1. Исправим это сделав проверку на наличии передаваемого параметра и если он не передается, будет выводиться «Привет мир!»

import sys if len(sys.argv) == 1: print('Привет мир!') else: print(f'Привет ') 

Теперь немного усложним задачу, что если мы хотим передавать имя с помощью именованного параметра —name, доработаем наш код:

import sys if len(sys.argv) == 1: print('Привет мир!') else: p_name = sys.argv[1] p_value = sys.argv[2] if p_name == '--name': print(f'Привет ') else: print(f'Неизвесный параметр ') 

Запустив скрипт таким образом:

python hello.py —name Александр

Получаем нужный результат, если в место «—name» передать другое значение, то получаем предупреждение.

Но, если мы передадим один параметр вместо двух, то скрипт не запуститься, нам необходимо добавить еще один if для проверки существование минимум двух параметров.

А если нам нужно добавить еще несколько параметров, а если не все из них обязательные… короче код начнется превращаться в ужас, вот здесь нам на помощь и придет модуль argparse стандартной питоновской библиотеки.

Использование модуля argparse

Этот модуль облегчит нам разбор и дальнейшее использование передаваемых скрипту аргументов из командной строки.

Начнем переписывать наш пример:

import argparse parser = argparse.ArgumentParser() parser.add_argument('name', nargs='?', default='мир!') args = parser.parse_args() print(f'Привет ') 

Сохраним код в новый файл hello2.py и выполним передав ему в качестве параметра «Александр»:

Читайте также:  Phpstorm file watcher css

python hello2.py Александр

Мы получим то, что требовалось:

Разберем подробнее строку:

parser.add_argument(‘name’, nargs=’?’, default=’мир!’)

В ней мы с помощью метода add_argument и передаваемых ему параметров, задали необязательный (для этого указали nargs=’?’) позиционный аргумент. Если аргумент не передается, то он принимает значение указанное в default.

Важно помнить, что при позиционных аргументах важен их порядок в момент, когда мы вызываем скрипт. Первый аргумент, переданный скрипту, становится первым позиционным аргументом, второй аргумент — вторым позиционным аргументом и т.д.

Продолжим доработку кода. Теперь мы хотим, чтобы Имя передавалось именованным параметром —name

Для этого всего лишь надо изменить одну строку создания аргумента

Теперь можно запустить скрипт с именованным параметром —name:

python hello2.py —name Александр

Мы получим «Привет Александр», а при отсутствии параметра, будет выводится значение по умолчанию «Привет мир».

У названия параметра может быть краткая форма, она записывается с одним ««, например:

parser.add_argument(‘-n’, ‘—name’, default=’мир!’)

А что если в качестве параметра —name мы заходим передать Имя + Фамилия?

python hello2.py —name Александр Третьяков

Выполнив это сейчас мы получим ошибку error: unrecognized arguments: Третьяков поскольку модуль argparse решил что фамилия это отдельный аргумент.

Чтобы поправить ситуацию, используем дополнительный параметр метода add_argument — nargs со значением «+», который обозначает, что мы ожидаем одно или более значений аргумента.

Теперь повторно вызвав скрипт, получим все переданные параметры в виде списка:

Привет [‘Александр’, ‘Третьяков’]

Выбор агрументов из определенных вариантов

Иногда может потребоваться, чтобы пользователь программы указал аргумент из заранее заданных вариантов (например нужно указать расширение конвертируемого файла или качество сохраняемого видео).

Если брать наш пример выше, можем добавить, чтобы скрипт принимал только определенные имена: Александр, Екатерина, Татьяна, Евгений. Для этого добавим в метод add_argument параметр choices, в котором укажем список возможных значений параметра (в нашем случае список имен).

parser.add_argument (‘-n’, ‘—name’, choices=[‘Александр’, ‘Екатерина’, ‘Татьяна’, ‘Евгений’])

Теперь при вызове скрипта мы должны обязательно указать параметр —name со значением из этого списка иначе возникнет ошибка:

python hello2.py —name Екатерина

А если попробуем передать имя не из одобренного списка:

hello2.py: error: argument -n/—name: invalid choice: ‘Ольга’ (choose from ‘Александр’, ‘Екатерина’, ‘Татьяна’, ‘Евгений’)

Справка (помощь) по аргументам

Выше мы ограничили список возможных значений аргумента —name четырьмя именами, но как узнать об этом пользователю, который в первый раз использует скрипт, ему придаться вчитываться в текст ошибки, чтобы понять чего от него хочет программа. Как пользователю узнать о всех возможных аргументах, порядке их применения и их назначении?

Читайте также:  Html href rel nofollow

Для этого мы можем оформить справку для программы, которая будет вызываться аргументом —help или -h. В справочной информации мы сможем указать название и версию программы, копирайт, описание того, что она делает, и список ожидаемых параметров.

Итак изменим 2 строчки нашего кода, добавив в него справочную информацию:

parser = argparse.ArgumentParser( prog='Greeting Script', description='Программа, которая говорит "Привет"', epilog='(c) Информация об авторе программы' ) parser.add_argument ('-n', '--name', choices=['Александр', 'Екатерина', 'Татьяна', 'Евгений'], help='Список из имен, которые я могу приветствовать') 

Мы получим справку о нашей программе:

usage: Greeting Script [-h] [-n ] Программа, которая говорит "Привет" optional arguments: -h, --help show this help message and exit -n , --name Список из имен, которые я могу приветствовать (c) Информация об авторе программы 

Аргументы как флаги

А что если мы хотим сделать так, чтобы при указании флага -bye программа говорила нам «До свидания»?

parser.add_argument (‘-bye’, action=’store_const’, const=True, help=’Установите, если нужно ли прощаться с пользователем’)

В метод add_argument мы добавили 2 новых параметра. Первый — action, он предназначен для выполнения некоторых действий над значениями переданного аргумента. В нашем случае мы передали значение параметра action — store_const, оно обозначает, что если данный аргумент (‘-bye’) указан, то он всегда будет принимать значение, указанное в другом параметре метода add_argument — const. А если аргумент передан не будет, то его значение будет равно None.

Так же в конце скрипта добавим вывод «До свидания», в случае установленного флага -bye:

if args.bye: print ('До свидания')

Теперь если добавить флаг -bye при вызове скрипта:

python hello2.py —name Александр -bye

Привет Александр До свидания

Без добавления -bye мы получим просто:

Флаги со значениями True и False используются часто, поэтому для этих целей предусмотрено 2 специальных значения для параметра action: store_true и store_false.

Можно переписать наш код так:

parser.add_argument (‘-bye’, action=’store_true’, help=’Установите, если нужно ли прощаться с пользователем’)

Мы использовали store_true, т.е. если параметр ‘-bye’ передан, он примет значение True.

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

Окончательный код нашего файла hello2.py:

import argparse parser = argparse.ArgumentParser( prog='Greeting Script', description='Программа, которая говорит "Привет"', epilog='(c) Информация об авторе программы' ) parser.add_argument ('-n', '--name', choices=['Александр', 'Екатерина', 'Татьяна', 'Евгений'], help='Список из имен, которые я могу приветствовать') parser.add_argument ('-bye', action='store_true', help='Установите, если нужно ли прощаться с пользователем') args = parser.parse_args() print(f'Привет ') if args.bye: print ('До свидания') 

На этом все, думаю общее представление о модуле argsparse вы получили, подробнее о нем можно почитать в официальной документации https://docs.python.org/3/library/argparse.html.

Категории

Свежие записи

Источник

Оцените статью