Краткое описание работы argparse в Python

22 Май
2012

При изучение питона решил изучить модуль optparse. В книге «Python в системном администрировании UNIX и Linux» этот модуль отлично описан, но в документаци сказанно, что развитие этого модуля будет продолжаться с argparse. Из-за этого я решил разобраться с этим модулем.

Далее попробую кратко разобрать модуль argparse.


Для примера был написан скрипт, который удаляет папки, дата которых больше определённого количества дней. Например, есть папка «2012-05-5», которая, при стандартном вызове скрипта, удалится через 7 дней от даты в имени.
Сам скрипт:

		#!/usr/bin/python
		#! -*- coding: utf-8 -*-
		import subprocess,datetime,os,argparse
		import proverka #модуль проверки на удаление


		def main():
		    m = argparse.ArgumentParser(description="Удаление папок с помощью %(prog)s", 
		                                               epilog="Эпилог программы %(prog)s",prog="del_f")
											
		    m.add_argument("--day","-d",type=int, default=7, 
		                        help="Количество дней, прошедших с даты в названии папки(для удаления)")
				
		    m.add_argument("--dir","-p",type=str,default='.', help="Путь к удаляемым папкам")
		    m.add_argument("--verbose","-v",action="store_true", 
		                        help="Выводить подробное описание действий",default=False)
		    m.add_argument("--exception","-e",type=str, default="",action="store",nargs='+', 
		                                         help="Исключить папки")
		    options = m.parse_args()
		    p=subprocess.Popen('ls',shell=True,stdout=subprocess.PIPE)
		    out = p.stdout.read()
		    mas_p=out.split('\n')
		    options =  vars(options)
		    options['dir'] += '/'
		    ex = options['exception']
		    print options['exception']

		    for t in mas_p:
		        if t not in ex:
			    if (proverka.proverka(t,options['day'])[0] == 'True'):
			        dell = 'rm -rf ' + options['dir'] + proverka.proverka(t,options['day'])[1]
				if options['verbose']:
				    print "Folder '" + proverka.proverka(t,options['day'])[1]  + "' is Deleting"
				subprocess.call(dell,shell=True)

		if __name__ == '__main__':
		    main()
		


Создание класса argparse.ArgumentParser.

Для начала рассмотрим работу класса argparse.ArgumentParser, который имеет вид:

class argparse.ArgumentParser([description][, epilog][, prog][, usage][, add_help][, argument_default][, parents][, prefix_chars][, conflict_handler][, formatter_class]) 

Аргумент description производит краткое описание того, что делает программа.
Результат отображается перед дополнительными аргументами.
Аналогично description работает epilog, но результат выводится после дополнительных аргументов:
rroot@kanst9:> python py.py -h
			usage: ...
			Удаление папок
			optional arguments:
			  ...
			Эпилог


Рассмотрим 2 варианта работы программы с аргументом prog:
m = argparse.ArgumentParser(description="Удаление папок с помощью %(prog)s",
						epilog="Эпилог программы %(prog)s")

Результат 1:
root@kanst9:> python py.py -h
			usage: ...
			Удаление папок с помощью df.py
			optional arguments:
			 ...
			Эпилог программы df.py


Для вставки мы использовали конструкцию %(prog)s. По умолчанию используется sys.argv[0].Теперь установим значение prog=«del_f»
m = argparse.ArgumentParser(description="Удаление папок с помощью %(prog)s",
						epilog="Эпилог программы %(prog)s" ,prog="del_f")

Результат 2:
root@kanst9:> python py.py -h
			usage: ....
			Удаление папок с помощью del_f
			optional arguments:
			  ...
			Эпилог программы del_f

С помощью аргумента prog можно задать название программы, и использовать это в справке.

Для краткого описания работы можно использовать аргумент usage
Пример:
m = argparse.ArgumentParser(..., usage='%(prog)s [arguments]')


Результат:
root@kanst9:> python py.py -h
			usage: del_f [arguments]

По умолчанию usage выглядит так:
usage: %(prog)s [аргументы]


Описание остальных аргументов можно посмотреть тут.

Добавление аргументов.

После создания парсера можно перейти к добавлению аргументов
Метод добавления аргументов выглядит следующим образом:
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type]
				[, choices][, required][, help][, metavar][, dest])

action=«store» — хранит значение аргумента.
action=«store_const» -хранит значение, указанное к *const*
parser.add_argument('--foo', action='store_const', const=2)

action=«store_true[false]» — аналогично store_const*, но хранит значения True и False.
version — добавляет аргумент версии.
parser.add_argument('--version', action='version', version='%(prog)s 2.0')

Добавим аргумент числа дней:
m.add_argument("--day","-d",type=int, default=7, help="Количество дней, прошедших с даты в названии папки(для удаления)")

Здесь:
type=int — указывает на формат данных.
default=7 -значение по умолчанию, равное 7.
help=»…» — описание аргумента, отображаемое в помощи.
Добавим аргумент пути:
m.add_argument("--dir","-p",type=str,default='.', help="Путь к удаляемым папкам")

Здесь всё как и в предыдущем аргументе.

Для подробного вывода работы скрипта создаётся аргумент:
m.add_argument("--verbose","-v",action="store_true", help="Выводить подробное описание действий", default=False)

action=«store_true» — показывает, что значение аргумента принимает только 2 значения True и False(по умолчанию)

Аргумент
m.add_argument("--exception","-e",type=str, default="", nargs='+', help="Исключить папки")

Исключает папки из удаляемых.
nargs=’+’ — заносит данные в список, причем если отсутствует хотя бы 1 аргумент, создаётся сообщение об ошибке.
При использовании nargs=’*’ сообщения об ошибке не будет.
root@kanst9:> python py.py -e
			usage: del_f [-h] [--day DAY] [--dir DIR] [--verbose]
				             [--exception EXCEPTION [EXCEPTION ...]]
			del_f: error: argument --exception/-e: expected at least one argument


Работа с аргументами.

С помощью метода parse_args() можно вывести аргументы:
print m.parse.args()
			Namespace(day=7, dir='.', exception='', verbose=False)


А с помощью vars(m.parse.args()) можно преобразовать результат в словарь:
print vars(m.parse.args())
			{'exception': '', 'day': 7, 'dir': '.', 'verbose': False}


Примеры работы скрипта:

root@kanst9:> ls
				2012-05-10/  2012-05-17/  2012-05-5/  df.py
				2012-05-13/  2012-05-4/   2012-05-9/  proverka.py
				root@kanst9:> python df.py -h    
				usage: del_f [-h] [--day DAY] [--dir DIR] [--verbose]
				             [--exception EXCEPTION [EXCEPTION ...]]

				Удаление папок с помощью del_f

				optional arguments:
				  -h, --help            show this help message and exit
				  --day DAY, -d DAY     Количество дней, прошедших с
				                        даты в названии папки(для
				                        удаления)
				  --dir DIR, -p DIR     Путь к удаляемым папкам
				  --verbose, -v         Выводить подробное описание
				                        действий
				  --exception EXCEPTION [EXCEPTION ...], -e EXCEPTION [EXCEPTION ...]
				                        Исключить папки

				Эпилог программы del_f

				root@kanst9:> python df.py -v  

				Folder  '2012-05-10'  is Deleting
				Folder  '2012-05-4'  is Deleting
				Folder  '2012-05-5'  is Deleting
				Folder  '2012-05-9'  is Deleting
				root@kanst9:> ls
				2012-05-10/  2012-05-17/  2012-05-5/  df.py
				2012-05-13/  2012-05-4/   2012-05-9/  proverka.py
				root@kanst9:> python df.py -v -d 10

				Folder  '2012-05-4'  is Deleting
				Folder  '2012-05-5'  is Deleting

				root@kanst9:> ls
				2012-05-10/  2012-05-17/  2012-05-5/  df.py
				2012-05-13/  2012-05-4/   2012-05-9/  proverka.py

				root@kanst9:> python df.py -v -d 10 -e 2012-05-4

				Folder  '2012-05-5'  is Deleting


P.S. Статью пишу первый раз. Хотелось бы услышать критику и пожелания.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх