Pull to refresh

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

При изучение питона решил изучить модуль 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. Статью пишу первый раз. Хотелось бы услышать критику и пожелания.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.