Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Анализ аргументов командной строки в Python

Поиск

Все программы можно условно разделить на консольные и использующие графический интерфейс (сервисы под Windows и демоны под Linux не будем брать в расчет). Параметры запуска, задаваемые через командную строку, чаще всего используют консольные программы.

ПРИМЕРЫ БЕЗ ИСПОЛЬЗОВАНИЯ ARGPARSE

Путь для начала у нас есть простейший скрипт на Python. Для определенности назовем скрипт coolprogram.py, это будет классический Hello World, над которым мы будем работать в дальнейшем.

#!/usr/bin/python
if __name__ == "__main__":
print ("Привет, мир!")

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

pythoncoolprogram.pyили python coolprogram.py Вася

Первое, что приходит на ум при решении такой задачи, просто воспользоваться переменной argv из модуля sys. Напомню, что sys.argv содержит список параметров, переданных программе через командную строку, причем нулевой элемент списка - это имя нашего скрипта. Т.е. если у нас есть следующий скрипт с именем params.py:

#!/usr/bin/python
import sys

if __name__ == "__main__":
for param in sys.argv:
print (param)

и мы запускаем его с помощью команды
python params.py

то в консоль будет выведена единственная строка:
params.py

Если же мы добавим несколько параметров,
python params.py param1 param2 param3

то эти параметры мы увидим в списке sys.argv, начиная с первого элемента:
params.py
param1
param2
param3

Здесь можно обратить внимание на то, что ссылка на интерпретатор Python в список этих параметров не входит, хотя он также присутствует в строке вызова нашего скрипта.

Вернемся к нашей задаче. Погрузившись в код на неделю, мы могли бы выдать заказчику следующий скрипт:

#!/usr/bin/python
import sys

if __name__ == "__main__":
if len (sys.argv) > 1:
print ("Привет, {}!".format (sys.argv[1]))
else:
print ("Привет, мир!")


Теперь, если программа вызывается с помощью команды
python coolprogram.py

то результат будет прежний
Привет, мир!

а если мы добавим параметр:
python coolprogram.py Вася

то программа поприветствует некоего Васю:
Привет, Вася!

Пока все легко и никаких проблем не возникает. Теперь предположим, что требования заказчика вновь изменились, и на этот раз он хочет, чтобы имя приветствуемого человека передавалось после именованного параметра --name или -n, причем нужно следить, что в командной строке передано только одно имя. С этого момента у нас начнется вермишель из конструкций if.

#!/usr/bin/python
import sys

if __name__ == "__main__":
if len (sys.argv) == 1:
print ("Привет, мир!")
else:
if len (sys.argv) < 3:
print ("Ошибка. Слишком мало параметров.")
sys.exit (1)

if len (sys.argv) > 3:
print ("Ошибка. Слишком много параметров.")
sys.exit (1)

param_name = sys.argv[1]
param_value = sys.argv[2]

if (param_name == "--name" or
param_name == "-n"):
print ("Привет, {}!".format (param_value))
else:
print ("Ошибка. Неизвестный параметр '{}'".format (param_name))
sys.exit (1)

Здесь мы проверяем ситуацию, что мы вообще не передали ни одного параметра, потом проверяем, что дополнительных параметров у нас ровно два, что они называются именно --name или -n, и, если нас все устраивает, выводим приветствие.

Как видите, код превратился в тихий ужас. Изменить логику работы в нем в дальнейшем будет очень сложно, а при увеличении количества параметров нужно будет срочно применять объектно-ориентированные меры по отделению логики работы программы от разбора командной строки. Разбор командной строки мы могли бы выделить в отдельный класс (или классы), но мы этого здесь делать не будем, поскольку все уже сделано в стандартной библиотеке Python, которая называется argparse.



Поделиться:


Последнее изменение этой страницы: 2017-02-19; просмотров: 328; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.220.196.68 (0.006 с.)