python как передать параметры в скрипт
Аргументы командной строки в Python. Модуль argparse
Иногда при вызове программы Python из командной строки нам нужно передать определенные аргументы, чтобы указать, как должен действовать код.
Обычно это определенные опции, которые заставляют его работать более специфическим образом в соответствии с потребностями пользователя.
Этот подход не является новым для тех пользователей, которые обычно используют командную строку, поскольку многим программам для выполнения тех или иных действий требуются параметры.
Например, когда мы выводим список каталогов в Linux, мы используем команду “ls”.
Но мы можем передать в качестве аргумента ‘-l’, чтобы показать его в виде списка с дополнительной информацией о файлах и каталогах.
В обоих примерах используется одна и та же команда, но в зависимости от приведенных аргументов она действует более специфическим образом.
Шаг аргументов
Способ получения аргументов от программы Python осуществляется благодаря функции “argv” в модуле “sys”.
Эта функция собирает все аргументы и возвращает их в виде списка.
Здесь мы видим программу, которая собирает параметры и печатает их на экране:
Обратите внимание, что выполнение приводит к выводу всех аргументов.
То есть, название программы также собирается как параметр и выводится на экран, поэтому оно будет сохранено в позиции 0 собранного списка.
Чтобы увидеть более наглядный пример того, как это работает, мы можем сделать программу на Python, которая суммирует все значения, переданные в качестве аргументов в строке кода.
Не имеет значения количество полученных аргументов, какими бы они ни были, все они будут сложены вместе, и результат будет выведен на экран.
Для этого мы сделаем цикл “for”, который будет проходить через все аргументы (sys.argv), и мы будем складывать их по одному, чтобы получить общее количество.
Теперь мы изменим нашу программу так, чтобы она могла складывать и умножать.
Сначала в первом аргументе мы передаем слово “sum” или “multiply”, а в остальных аргументах – числа, которые мы собираемся сложить или умножить.
Программа будет выглядеть следующим образом:
Как мы видели в предыдущих примерах, способ доступа к аргументам, поступающим из командной строки, в Python очень прост.
Что действительно сложнее, так это их валидация, поскольку пользователь может разместить аргументы неправильно или в ненужных местах, и это может привести к сбою или некорректной работе программы.
Argparse
Для выполнения задачи по сбору аргументов в Python мы можем использовать модуль “argparse”.
Argparse облегчает задачу, поскольку мы можем указать ожидаемые аргументы, их тип, значения, которые они могут иметь, и другие функции, которые мы увидим позже.
Чтобы использовать этот инструмент, мы должны импортировать модуль “argparse”.
Затем argparse объявляется с помощью функции “ArgumentParser”.
В завершение необходимо вызвать “parse_args” для преобразования строк в объекты.
Эта структура будет базовой для использования инструмента.
Справка показывает, как использовать инструмент, описание и аргументы.
Очевидно, что пока эта справка пуста, но она будет постепенно дополняться следующими примерами:
Ознакомившись с описанием, мы создадим аргументы, которые ожидаются в каждой строке кода.
Для определения ожидаемых аргументов мы используем функцию “add_argument”.
Эта функция будет вызываться один раз для каждого аргумента, который мы хотим определить.
Структура выглядит следующим образом:
Мы собираемся посмотреть, как это работает, на том же примере, который мы рассматривали в предыдущем разделе.
То есть, мы создадим программу, которая складывает или умножает ряд значений, передаваемых в качестве аргументов через командную строку.
Это простой пример, но он позволяет увидеть все рассмотренные ранее варианты:
Как вы видите, мы объявили три аргумента в нашей программе.
Первый – ‘-op’, он подбирает тип операции, которая будет выполняться, тип строки, он обязателен и позволяет вставить только “sum” или “multiply”.
Второй – объектные значения операции. Это также обязательное поле, его значение хранится в переменной “values” и может принимать от 0 до n значений.
Третий используется для активации режима отладки. Поэтому, если вы не укажете это в командной строке, оно будет установлено в false, и режима отладки не будет. Если вместо этого мы поместим его в командную строку, он примет значение true и будет показана отладка.
2) Если отсутствуют обязательные аргументы, то выдается ошибка, указывающая, какие именно аргументы отсутствуют:
3) Если выбрана операция, отличная от сложения или умножения, она также проверяет ее:
4) Сумма трех значений:
5) Умножение двух значений:
6) Сумма 4 значений при включенной отладке:
Аргументы командной строки в Python
В этом уроке мы погружаемся в аргументы командной строки в Python. Используя модуль sys, модуль getopt и модуль argparse, мы будем анализировать и читать аргументы.
Обзор
Поскольку Python является таким популярным языком программирования, а также имеет поддержку большинства операционных систем, он стал широко использоваться для создания инструментов командной строки для многих целей. Эти инструменты могут варьироваться от простых приложений CLI до более сложных, таких как AWS’ aws cli tool.
Как правило, аргументы передаются инструментам CLI по-разному, в зависимости от вашей операционной системы:
Эти различные подходы существуют в силу исторических причин. Многие программы в Unix-подобных системах поддерживают как одинарную, так и двойную тире-нотацию. Одинарная тире-нотация в основном используется с однобуквенными опциями, в то время как двойные тире представляют собой более читаемый список опций, что особенно полезно для сложных опций, которые должны быть более явными.
Обработка аргументов командной строки с помощью Python
Каждый из этих способов имеет свои плюсы и минусы, поэтому стоит оценить каждый из них, чтобы увидеть, какой из них лучше всего соответствует вашим потребностям.
Модуль sys
Печать первого аргумента CLI
В этом первом примере наш скрипт определит способ его вызова. Эта информация хранится в первом аргументе командной строки, индексируемом с 0. Приведенный ниже код показывает, как вы получаете имя вашего скрипта Python.
Сохраните этот код в файле с именем arguments-program-name.py, а затем назовите его, как показано ниже. Выходные данные выглядят следующим образом и содержат имя файла, включая его полный путь:
Как вы можете видеть из второго вызова выше, мы получаем не только имя файла Python, но и полный путь, используемый для его вызова.
Подсчет количества аргументов
Сохраните и назовите этот файл arguments-count.py. Некоторые примеры вызова этого скрипта приведены ниже. Это включает в себя три различных сценария:
Перебор Аргументов
Наш третий пример выводит каждый аргумент, отправленный скрипту Python, за исключением самого имени программы. Поэтому мы перебираем аргументы командной строки, начиная с элемента second list. Напомним, что это индекс 1, так как списки в Python основаны на 0.
Ниже мы называем наш код, который был сохранен в файл arguments-output.py. Как и в нашем предыдущем примере, выходные данные иллюстрируют три различных вызова:
Помните, что смысл показа примера строки в кавычках заключается в том, что параметры обычно разделяются пробелом, если только они не окружены кавычками.
Модуль getopt
Как вы, возможно, уже заметили, модуль sys разбивает строку командной строки только на отдельные грани. Модуль Python getopt идет немного дальше и расширяет разделение входной строки проверкой параметров. Основываясь на функции getopt C, он допускает как короткие, так и длинные варианты, включая присвоение значения.
Это означает, что эти аргументы являются теми, которые мы считаем действительными, наряду с некоторой дополнительной информацией:
Сам вызов метода хранится в операторе try-catch для покрытия ошибок во время вычисления. Исключение возникает, если обнаружен аргумент, который не является частью списка, как было определено ранее. Скрипт Python выведет сообщение об ошибке на экран и завершит работу с кодом ошибки 2.
Ниже вы можете увидеть результаты выполнения этого кода. Мы покажем, как программа реагирует как с допустимыми, так и с недопустимыми аргументами программы:
Модуль argparse
В приведенном ниже коде показана инициализация парсера, а в приведенном ниже выводе-базовый вызов, за которым следует справочное сообщение. В отличие от вызовов Python, которые мы использовали в предыдущих примерах, имейте в виду использовать Python 3 с этими примерами.
Здесь мы покажем, что происходит при подаче различных значений аргументов. Это включает в себя как короткую, так и длинную версию, а также справочное сообщение.
Вывод
Простое руководство по аргументам командной строки Python
Dec 25, 2019 · 5 min read
Почти каждый современный ЯП способен принимать аргументы из командной строки. Это очень важная функция, поскольку она допускает динамический ввод данных от пользователей, независимо от того, написали они программу или нет.
Библиот е ка Python argparse была выпущена как часть стандартной библиотеки вместе с Python 3.2. После этого релиза в силу своей популярности она была интегрирована в Python 2.7 и во все будущие версии Python, быстро став золотым стандартом для работы с аргументами командной строки. Она предоставляет следующие функции:
Проведем небольшую экскурсию по библиотеке argparse Python.
Начальная установка
Откройте пустой сценарий Python. Библиотека argparse встроена в Python, соответственно процедура установки не потребуется. На фрагменте кода ниже показано, как создать начальную установку для argparse:
В этом коде есть 3 важных компонента:
На втором этапе мы создаем объект parser, с помощью которого можно добавлять аргументы командной строки вместе с опциями для каждого из них. На третьем этапе запускается функция, которая извлекает введенные пользователем аргументы из командной строки.
Простые варианты использования аргументов командной строки
Продвинутые варианты использования и советы
Настало время двигаться дальше и перейти к продвинутому argparse!
Мы также можем установить так называемые взаимоисключающие группы, определяющие набор аргументов командной строки парсера, которые не могут быть переданы одновременно.
Вот и все! Вы прошли простое руководство по аргументам командной строки Python.
jenyay.net
Софт, исходники и фото
Разбор параметров командной строки в Python
Содержание
Введение
Как вы, наверное, знаете, все программы можно условно разделить на консольные и использующие графический интерфейс (сервисы под Windows и демоны под Linux не будем брать в расчет). Параметры запуска, задаваемые через командную строку, чаще всего используют консольные программы, хотя программы с графическим интерфейсом тоже не брезгуют этой возможностью. Наверняка в жизни каждого программиста была ситуация, когда приходилось разбирать параметры командной строки, как правило, это не самая интересная часть программы, но без нее не обойтись. Эта статья посвящена тому, как Python облегчает жизнь программистам при решении этой задачи благодаря своей стандартной библиотеке argparse.
В дальнейшем все примеры я буду приводить с расчетом на Python 3.3, но практически все то же самое можно использовать и в Python 2.7, хотя для запуска на Python 2.7 примеры придется исправить, в основном добавить символ «u» перед началом строк.
Примеры без использования argparse
Путь для начала у нас есть простейший скрипт на Python. Для определенности назовем скрипт coolprogram.py, это будет классический Hello World, над которым мы будем работать в дальнейшем.
if __name__ == «__main__» :
print ( «Привет, мир!» )
Мы завершили эту сложнейшую программу и отдали ее заказчику, он доволен, но просит добавить в нее возможность указывать имя того, кого приветствуем, причем этот параметр может быть не обязательным. Т.е. программа может использоваться двумя путями:
$ python coolprogram.py Вася
и мы запускаем его с помощью команды
то в консоль будет выведена единственная строка:
Если же мы добавим несколько параметров,
то эти параметры мы увидим в списке sys.argv, начиная с первого элемента:
Здесь можно обратить внимание на то, что ссылка на интерпретатор Python в список этих параметров не входит, хотя он также присутствует в строке вызова нашего скрипта.
Вернемся к нашей задаче. Погрузившись в код на неделю, мы могли бы выдать заказчику следующий скрипт:
Теперь, если программа вызывается с помощью команды
то результат будет прежний
а если мы добавим параметр:
то программа поприветствует некоего Васю:
Пока все легко и никаких проблем не возникает. Теперь предположим, что требования заказчика вновь изменились, и на этот раз он хочет, чтобы имя приветствуемого человека передавалось после именованного параметра —name или -n, причем нужно следить, что в командной строке передано только одно имя. С этого момента у нас начнется вермишель из конструкций if.
Здесь мы проверяем ситуацию, что мы вообще не передали ни одного параметра, потом проверяем, что дополнительных параметров у нас ровно два, что они называются именно —name или -n, и, если нас все устраивает, выводим приветствие.
Как видите, код превратился в тихий ужас. Изменить логику работы в нем в дальнейшем будет очень сложно, а при увеличении количества параметров нужно будет срочно применять объектно-ориентированные меры по отделению логики работы программы от разбора командной строки. Разбор командной строки мы могли бы выделить в отдельный класс (или классы), но мы этого здесь делать не будем, поскольку все уже сделано в стандартной библиотеке Python, которая называется argparse.
Использование библиотеки argparse
Первый пример
Как как было сказано выше, стандартная библиотека argparse предназначена для облегчения разбора командной строки. На нее можно возложить проверку переданных параметров: их количество и обозначения, а уже после того, как эта проверка будет выполнена автоматически, использовать полученные параметры в логике своей программы.
Основой работы с командной строкой в библиотеке argparse является класс ArgumentParser. У его конструктора и методов довольно много параметров, все их рассматривать не будем, поэтому в дальнейшем рассмотрим работу этого класса на примерах, попутно обсуждая различные параметры.
Простейший принцип работы с argparse следующий:
Для начала перепишем программу coolprogram.py с единственным параметром так, чтобы она использовала библиотеку argparse. Напомню, что в данном случае мы ожидаем следующий синтаксис параметров:
Здесь [Имя] является необязательным параметром.
Наша программа с использованием argparse может выглядеть следующим образом:
На первый взгляд эта программа работает точно так же, как и раньше, хотя есть отличия, но мы их рассмотрим чуть позже. Пока разберемся с тем, что мы понаписали в программе.
Создание парсера вынесено в отдельную функцию, поскольку эта часть программы в будущем будет сильно изменяться и разрастаться. На строке 9 мы создали экземпляр класса ArgumentParser с параметрами по умолчанию. Что это за параметры, опять же, поговорим чуть позже.
На строке 10 мы добавили ожидаемый параметр в командной строке с помощью метода add_argument. При этом такой параметр будет считаться позиционным, т.е. он должен стоять именно на этом месте и у него не будет никаких предварительных обозначений (мы их добавим позже в виде ‘-n’ или ‘—name’). Если бы мы не добавили именованный параметр nargs=’?‘, то этот параметр был бы обязательным. nargs может принимать различные значения. Если бы мы ему присвоили целочисленное значение больше 0, то это бы означало, что мы ожидаем ровно такое же количество передаваемых параметров (точнее, считалось бы, что первый параметр ожидал бы список из N элементов, разделенных пробелами, этот случай мы рассмотрим позже). Также этот параметр может принимать значение ‘?’, ‘+’, ‘*’ и argparse.REMAINDER. Мы их не будем рассматривать, поскольку они важны в сочетании с необязательными именованными параметрами, которые могут располагаться как до, так и после нашего позиционного параметра. Тогда этот параметр будет показывать как интерпретировать список параметров, где будет заканчиваться один список параметров и начинаться другой.
Итак, мы создали парсер, после чего можно вызвать его метод parse_args для разбора командной строки. Если мы не укажем никакого параметра, это будет равносильно тому, что мы передадим в него все параметры из sys.argv кроме нулевого, который содержит имя нашей программы. т.е.
В качестве результата мы получим экземпляр класса Namespace, который будет содержать в качестве члена имя нашего параметра. Теперь можно раскомментировать строку 19 в приведенном выше примере, чтобы посмотреть, чему же равны наши параметры.
Если мы это сделаем и запустим программу с переданным параметром
Как написать игру на Python3
Самоучитель Python3 для начинающих
Передача параметров в скрипт Python из командной строки.
При запуске скриптов, часто требуется указать какие-то дополнительные параметры, которые будут использованы в ходе работы программы. Конечно, можно при помощи функции input() получить данные от пользователя и сохранить их в переменных. Как говорится, дело вкуса. Но вместо множественного вызова функции input() есть намного более элегантное решение. Это передача параметров в скрипт python, непосредственно в командной строке — в момент вызова программы. Как это сделать? Давайте разберемся.
Для начала, наберите небольшую программу в своем редакторе. Сохраните её в папке C:\PyScript под именем input_var.py. Разумеется, папку и файл можете назвать как угодно, но тогда не забудьте указать свои данные при вызове скрипта в командной строке.
Как видите, программа очень маленькая. Но её вполне хватит для демонстрации способа передачи данных в скрипт. После того, как следуя приведенным выше инструкциям, вы набрали и сохранили программу, вызовите командную строку Windows. После этого укажите имя интерпретатора python, путь к вызываемому файлу и три значения, разделяя все пробелами, как на рисунке ниже:
Рис. 1 Передача данных в скрипт Python
» data-medium-file=»https://writegamepython.files.wordpress.com/2018/06/input_var11.png?w=300″ data-large-file=»https://writegamepython.files.wordpress.com/2018/06/input_var11.png?w=593″ src=»https://writegamepython.files.wordpress.com/2018/06/input_var11.png?w=593″ alt=»Передача данных в скрипт Python» srcset=»https://writegamepython.files.wordpress.com/2018/06/input_var11.png?w=593 593w, https://writegamepython.files.wordpress.com/2018/06/input_var11.png?w=150 150w, https://writegamepython.files.wordpress.com/2018/06/input_var11.png?w=300 300w, https://writegamepython.files.wordpress.com/2018/06/input_var11.png 677w» sizes=»(max-width: 593px) 100vw, 593px» />
Рис. 1 Передача данных в скрипт Python
Если у вас скрипт хранится в другой папке — укажите свой путь к нему. После этого нажмите клавишу Enter на клавиатуре. В результате вы должны увидеть следующее:
Рис. 2 Результат выполнения программы
» data-medium-file=»https://writegamepython.files.wordpress.com/2018/06/input_var2.png?w=300″ data-large-file=»https://writegamepython.files.wordpress.com/2018/06/input_var2.png?w=593″ src=»https://writegamepython.files.wordpress.com/2018/06/input_var2.png?w=593″ alt=»Передача данных в скрипт Python» srcset=»https://writegamepython.files.wordpress.com/2018/06/input_var2.png?w=593 593w, https://writegamepython.files.wordpress.com/2018/06/input_var2.png?w=150 150w, https://writegamepython.files.wordpress.com/2018/06/input_var2.png?w=300 300w, https://writegamepython.files.wordpress.com/2018/06/input_var2.png 677w» sizes=»(max-width: 593px) 100vw, 593px» />
Рис. 2 Результат выполнения программы
А теперь давайте разберем, как же это все работает.
Во второй строке мы импортируем argv из модуля sys. Во многих языках переменных argv — стандартное имя. В этой переменной хранятся данных, которые вы передаете сценарию. Пока нам достаточно знать, что эта переменная работает как «контейнер», в котором мы можем передать данные скрипту.
В четвертой строке мы производим «распаковку» содержимого argv в переменные. Слово «распаковка» может показаться странным, но в данном случае оно наиболее подходит. Фактически, мы сообщаем интерпретатору Python, что он должен взять данные из argv и последовательно поместить их в переменные, которые мы указали с левой стороны. После этого мы можем работать с ними как с обычными переменными, которым присвоили значения.
Вы можете указать свои значения вместо «15 два 105», но число значений, которые вы передаете скрипту, должно строго соответствовать количеству переменных, в которые «распаковывается» содержимое argv. Иначе вы увидите сообщение об ошибке:
Рис. 3 Ошибка распаковки данных
» data-medium-file=»https://writegamepython.files.wordpress.com/2018/06/input_var3.png?w=300″ data-large-file=»https://writegamepython.files.wordpress.com/2018/06/input_var3.png?w=593″ src=»https://writegamepython.files.wordpress.com/2018/06/input_var3.png?w=593″ alt=»Передача данных в скрипт python» srcset=»https://writegamepython.files.wordpress.com/2018/06/input_var3.png?w=593 593w, https://writegamepython.files.wordpress.com/2018/06/input_var3.png?w=150 150w, https://writegamepython.files.wordpress.com/2018/06/input_var3.png?w=300 300w, https://writegamepython.files.wordpress.com/2018/06/input_var3.png 677w» sizes=»(max-width: 593px) 100vw, 593px» />
Рис. 3 Ошибка распаковки данных.
Это сообщение возникло потому что мы передали в скрипт Python недостаточно данных. Если конкретнее, то строка ValueError прямо сообщает, что необходимо 4 значения, но указано 3 (имя скрипта передается автоматически).
Не забывайте, что все данные, которые мы передаем в программу python являются строковыми значениями. Поэтому параметры «10» и «105» сначала необходимо преобразовать в числовой тип при помощи функции int(), а только потом использовать в математических операциях. Будьте внимательны!