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()
Ответы
Ответ 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 ""