有没有办法在python argparse的描述文本后打印用法文本?我有我的cmd行argparse工作,但我想在使用信息之前打印版本信息。
编辑:
version: 1.0
usage: blahcmd [-h] [-help]
some lovely help
答案 0 :(得分:4)
这是一个丑陋的黑客(请参阅我对原始问题的评论):
定义您自己的HelpFormatter
子类,并使用formatter_class
选项传递给解析器。子类应该可以覆盖_format_usage
方法。这并不是完全推荐的,因为用于定义自己的格式化类的界面从未公开过。
from argparse import ArgumentParser, HelpFormatter
from gettext import gettext as _
class VersionedHelp(HelpFormatter):
def _format_usage(self, usage, actions, groups, prefix=None):
if prefix is None:
prefix = _('Version: x.y\n\nusage: ')
return HelpFormatter._format_usage(self, usage, actions, groups, prefix)
p = ArgumentParser(formatter_class=VersionedHelp)
p.parse_args()
答案 1 :(得分:4)
argparse
模块没有提供添加" prolog"的任何选项。显示帮助时,始终以usage:
开头。您可以做的最好的方法是在实例化ArgumentParser
时使用usage
参数自定义添加版本号的使用文本:
import argparse
parser = argparse.ArgumentParser(usage='Any text you want\n')
请注意,帮助仍将以usage:
开头。
可能有效的肮脏变通方法是使用usage
启动\r
消息:
>>> import argparse
>>> usage = '\r{}\nusage: %(prog)s etc.'.format('Version a b'.ljust(len('usage:')))
>>> parser = argparse.ArgumentParser(usage=usage)
>>> parser.parse_args(['-h'])
Version a b
usage: etc.
optional arguments:
-h, --help show this help message and exit
我不认为\r
的这种用法是可移植的。可能有一些终端,这个技巧不起作用。我已ljust
修改了版本字符串,以确保当该技巧有效时,整个usage:
字符串会从字符串中消失,并且您不会获得v1.2e:
之类的内容使用短版本字符串。
注意:您必须手动立即创建整个 usage
文字。
答案 2 :(得分:2)
一个粗略的解决方案是将版本文本添加到您的使用行。它并不完美(请注意额外的'用法'文字),但这是一个开始
In [64]: parser=argparse.ArgumentParser(description='description')
# 'usage' parameter just sets the 'usage' attribute
In [67]: parser.usage='version 1.0.1\n'+parser.format_usage()
In [68]: parser.print_help()
usage: version 1.0.1
usage: ipython [-h]
description
optional arguments:
-h, --help show this help message and exit
help
中的组件顺序由ArgumentParser.format_help
方法确定(引自argparse.py
文件):
def format_help(self):
formatter = self._get_formatter()
# usage
formatter.add_usage(self.usage, self._actions,
self._mutually_exclusive_groups)
# description
formatter.add_text(self.description)
# positionals, optionals and user-defined groups
for action_group in self._action_groups:
formatter.start_section(action_group.title)
formatter.add_text(action_group.description)
formatter.add_arguments(action_group._group_actions)
formatter.end_section()
# epilog
formatter.add_text(self.epilog)
# determine help from format above
return formatter.format_help()
我可以想象编写一个添加版本信息的自定义方法,例如
def format_help(self):
formatter = self._get_formatter()
# version info
formatter.add_text('version 1.0.1')
# usage
formatter.add_usage(self.usage, self._actions,
self._mutually_exclusive_groups)
...
在ipython
中,此功能有效:
In [74]: def format_help(parser):
formatter=parser._get_formatter()
formatter.add_text('version 1.0.1')
formatter.add_usage(parser.usage, parser._actions, parser._mutually_exclusive_groups)
formatter.add_text(parser.description)
return formatter.format_help()
In [75]: print format_help(parser)
version 1.0.1
usage: ipython [-h]
description