При изучение питона решил изучить модуль optparse. В книге «Python в системном администрировании UNIX и Linux» этот модуль отлично описан, но в документаци сказанно, что развитие этого модуля будет продолжаться с argparse. Из-за этого я решил разобраться с этим модулем.
Для примера был написан скрипт, который удаляет папки, дата которых больше определённого количества дней. Например, есть папка «2012-05-5», которая, при стандартном вызове скрипта, удалится через 7 дней от даты в имени.
Сам скрипт:
Для начала рассмотрим работу класса argparse.ArgumentParser, который имеет вид:
Аргумент description производит краткое описание того, что делает программа.
Результат отображается перед дополнительными аргументами.
Аналогично description работает epilog, но результат выводится после дополнительных аргументов:
Рассмотрим 2 варианта работы программы с аргументом prog:
Результат 1:
Для вставки мы использовали конструкцию %(prog)s. По умолчанию используется sys.argv[0].Теперь установим значение prog=«del_f»
Результат 2:
С помощью аргумента prog можно задать название программы, и использовать это в справке.
Для краткого описания работы можно использовать аргумент usage
Пример:
Результат:
По умолчанию usage выглядит так:
Описание остальных аргументов можно посмотреть тут.
После создания парсера можно перейти к добавлению аргументов
Метод добавления аргументов выглядит следующим образом:
action=«store» — хранит значение аргумента.
action=«store_const» -хранит значение, указанное к *const*
action=«store_true[false]» — аналогично store_const*, но хранит значения True и False.
version — добавляет аргумент версии.
Добавим аргумент числа дней:
Здесь:
type=int — указывает на формат данных.
default=7 -значение по умолчанию, равное 7.
help="..." — описание аргумента, отображаемое в помощи.
Добавим аргумент пути:
Здесь всё как и в предыдущем аргументе.
Для подробного вывода работы скрипта создаётся аргумент:
action=«store_true» — показывает, что значение аргумента принимает только 2 значения True и False(по умолчанию)
Аргумент
Исключает папки из удаляемых.
nargs='+' — заносит данные в список, причем если отсутствует хотя бы 1 аргумент, создаётся сообщение об ошибке.
При использовании nargs='*' сообщения об ошибке не будет.
С помощью метода parse_args() можно вывести аргументы:
А с помощью vars(m.parse.args()) можно преобразовать результат в словарь:
P.S. Статью пишу первый раз. Хотелось бы услышать критику и пожелания.
Далее попробую кратко разобрать модуль 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. Статью пишу первый раз. Хотелось бы услышать критику и пожелания.