Подтвердить что ты не робот

Python optparse, как включить дополнительную информацию в использование?

Используя модуль ppton optparse, я хотел бы добавить дополнительные строки примеров ниже регулярного использования. Мой текущий файл 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

Как бы я это сделал? Какие опции оптации позволяют? Текущий код:

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()
4b9b3361

Ответ 1

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

Ответ 2

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

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

чтобы получить helptext, напечатанный как дословный эпилог.

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

Ответ 3

Используйте параметр 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)

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

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

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

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

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

Ответ 4

Другая идея о том, как это сделать, - отключить поведение по умолчанию для -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.

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

Ответ 5

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

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

Ответ 6

Я подклассифицировал 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 ""