Python optparse, как включить дополнительную информацию в выводе использования? - PullRequest
26 голосов
/ 07 декабря 2009

Используя модуль optparse в python, я хотел бы добавить дополнительные строки примера ниже вывода обычного использования. Мой текущий вывод help_print () выглядит так:

usage: check_dell.py [options]

options:
-h, --help     show this help message and exit
-s, --storage  checks virtual and physical disks
-c, --chassis  checks specified chassis components

Я бы хотел включить примеры использования для менее грамотных * nix пользователей на моей работе. Примерно так:

usage: check_dell.py [options]

options:
-h, --help     show this help message and exit
-s, --storage  checks virtual and physical disks
-c, --chassis  checks specified chassis components

Examples:

check_dell -c all
check_dell -c fans memory voltage
check_dell -s

Как бы мне этого добиться? Какие варианты optparse позволяют для такого? Текущий код:

import optparse

def main():
    parser = optparse.OptionParser()
    parser.add_option('-s', '--storage', action='store_true', default=False, help='checks virtual and physical disks')
    parser.add_option('-c', '--chassis', action='store_true', default=False, help='checks specified chassis components')

(opts, args) = parser.parse_args()

Ответы [ 6 ]

42 голосов
/ 07 декабря 2009
parser = optparse.OptionParser(epilog="otherstuff")

По умолчанию format_epilog удаляет символы новой строки (использует textwrap), поэтому вам нужно переопределить format_epilog в вашем парсере следующим образом.

def main():

    class MyParser(optparse.OptionParser):
        def format_epilog(self, formatter):
            return self.epilog

    parser =MyParser(epilog=
"""Examples:

check_dell -c all
check_dell -c fans memory voltage
check_dell -s
""")
...

Вот немного подробнее.
Если вы посмотрите в optparse.py в классе OptionParser, есть метод с именем format_epilog, который вызывается format_help

вот фрагмент из optparse.py

def format_epilog(self, formatter):
    return formatter.format_epilog(self.epilog)

def format_help(self, formatter=None):
    if formatter is None:
        formatter = self.formatter
    result = []
    if self.usage:
        result.append(self.get_usage() + "\n")
    if self.description:
        result.append(self.format_description(formatter) + "\n")
    result.append(self.format_option_help(formatter))
    result.append(self.format_epilog(formatter))
    return "".join(result)

Поведение по умолчанию formatter.format_epilog заключается в использовании textwrap.fill, который, помимо прочего, удаляет символы новой строки из эпилога. Поскольку мы хотим, чтобы символы новой строки были сохранены, мы создаем подкласс OptionParser и изменяем поведение format_epilog

12 голосов
/ 03 февраля 2011

Разрабатывая выигрышный ответ (который помог мне решить ту же проблему в моем собственном коде), один быстрый и грязный вариант заключается в прямом переопределении метода класса с помощью метода идентификации:

optparse.OptionParser.format_epilog = lambda self, formatter: self.epilog
optparser = optparse.OptionParser(epilog=helptext)

для получения справочного текста в виде стенографического эпилога.

Я думаю, что это переопределяет форматирование эпилога для всех применений класса OptionParser в вашей программе, поэтому все такие эпилоги должны передаваться дословно, когда вы используете OptionParser в другом месте вашей программы.

5 голосов
/ 07 декабря 2009

Используйте параметр usage:

usage = "usage: %prog [options] arg1 arg2"
parser = OptionParser(usage=usage)

Вы можете добавить больше через (просто пример):

group = OptionGroup(parser, "Dangerous Options",
                    "Caution: use these options at your own risk.  "
                    "It is believed that some of them bite.")
group.add_option("-g", action="store_true", help="Group option.")
parser.add_option_group(group)

Пример вывода:

использование: [options] arg1 arg2

опции: -h, --help показать это справочное сообщение и выйти
-v, --verbose много шума [по умолчанию]
-q, - тихо, будь очень тихим (я охотюсь на тварей)
-fFILE, --file = FILE записать вывод в FILE
-mMODE, --mode = Режим взаимодействия MODE: один из «новичок», «средний», [по умолчанию], «эксперт»

Опасные варианты: Осторожно: использование эти варианты на свой страх и риск. Это Считается, что некоторые из них кусаются. -g Групповая опция.

Посмотрите здесь .

4 голосов
/ 14 мая 2010

Еще одна идея, как это сделать, - отключить поведение по умолчанию для -h и распечатать собственный экран справки, который может включать в себя экран по умолчанию:

from optparse import OptionParser

parser = OptionParser(add_help_option=False, 
                      epilog="This can't be easily\n multilined")
parser.add_option('-h', '--help', dest='help', action='store_true',
                  help='show this help message and exit')

(options, args) = parser.parse_args()

if options.help:
    parser.print_help()
    print 'now we have an epilog'
    print 'with as many lines as you wish'
    sys.exit()

Это в основном то, что синтаксический анализатор делает с поведением по умолчанию add_help_option=True, исключая, конечно, print s.

Но, честно говоря, я бы также предпочел способ просто добавить любое заданное количество строк описания в начале и в конце.

2 голосов
/ 07 декабря 2009

Существует параметр description, который вы можете передать конструктору OptionParser. Это позволяет вам включать произвольный текст, который появляется после usage, но перед списком параметров.

См. 16.4.3.1. Создание парсера .

0 голосов
/ 04 апреля 2014

Я вложил в подкласс IndentedHelpFormatter, и это было довольно просто:

class PlainHelpFormatter(optparse.IndentedHelpFormatter):
    def format_description(self, description):
        if description:
            return description + "\n"
        else:
            return ""
    def format_epilog(self, epilog):
        if epilog:
            return epilog + "\n"
        else:
            return ""
...