来自文本文件的 Argparse 自定义帮助
Argparse custom help from text file
我想使用 argparse 库,因为它很灵活,但我无法禁用默认帮助对话框来显示文本文件中的自定义帮助对话框。我想要做的就是在传递“-h”或“--help”选项时显示文本文件中的文本。这是我如何尝试的示例:
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("file", type=str, nargs='+')
parser.add_argument("-xmin", type=float)
parser.add_argument("-xmax", type=float)
parser.add_argument("-ymin", type=float)
parser.add_argument("-ymax", type=float)
parser.add_argument("-h", "--help", action="store_true")
args = parser.parse_args()
if args.help is True:
print isip_get_help()
exit(-1)
但它仍然输出:
nedc_[1]: python isip_plot_det.py -h
usage: isip_plot_det.py [-xmin XMIN] [-xmax XMAX] [-ymin YMIN] [-ymax YMAX]
[-h]
file [file ...]
isip_plot_det.py: error: too few arguments
有什么想法吗?
失败是由于缺少必需的参数file
造成的。 action
不受此验证要求的原因很简单,因为它们先执行,即 args.help
将设置为 True
。但是,一旦解析器完成解析参数,它会由于验证失败而触发 sys.exit
,这将以打印出默认用法而结束,并且您的代码(打印您想要的帮助消息)将永远不会执行(您可以尝试使用 -h file
参数按原样调用您的程序,您的帮助消息应该会打印出来)。
您可以使用 parser.register
添加您的自定义操作(未正式支持,因为它被认为是私有的 API,但它有效 - 阅读 argparse.py
了解它是如何工作的),或者子类 ArgumentParser
并覆盖 print_help
方法来调用 isip_get_help()
.
您可以尝试这样的操作:
class MyArgumentParser(argparse.ArgumentParser):
def print_help(self, file=None):
print(isip_get_help())
exit(-1)
parser = MyArgumentParser()
...
保留默认值 add_help
,但覆盖 print_help
以调用您的自定义帮助,它应该可以工作。
您得到的是一条错误消息,而不是帮助(即它不是由您的 -h
生成的)。
isip_plot_det.py: error: too few arguments
错误信息显示的是正常帮助的用法部分。您可以使用 usage
参数更改它:
parser = ArgumentParser(usage = 'my custom usage line')
您还可以使用
测试使用显示
parser.print_usage()
或
astr = parser.format_usage()
获取可打印的字符串。
正常的 help
参数使用特殊的 help
动作 class。它的call
方法是:
def __call__(self, parser, namespace, values, option_string=None):
parser.print_help()
parser.exit()
请注意,它显示 parser.print_help()
的帮助,然后退出。一旦它解析 -h
字符串,就会发生这种情况。这样它就不会产生任何错误,如 too few arguments
或 unrecognized arguments
(在解析结束时产生)。
因此自定义帮助的另一种方法是子class ArgumentParser
,并定义您自己的print_help
方法。您还可以自定义 exit
和 error
方法。
默认的print_help
是:
def print_help(self, file=None):
if file is None:
file = sys.stdout
self._print_message(self.format_help(), file)
您可以自定义 format_help
。
class MyParser(argparse.ArgumentParser):
def format_help(self):
return 'my custom help message\n second line\n\n'
示例用法:
In [104]: parser=MyParser(usage='custom usage')
In [105]: parser.parse_args(['-h'])
my custom help message
second line
...
In [106]: parser.parse_args(['unknown'])
usage: custom usage
ipython3: error: unrecognized arguments: unknown
...
我想使用 argparse 库,因为它很灵活,但我无法禁用默认帮助对话框来显示文本文件中的自定义帮助对话框。我想要做的就是在传递“-h”或“--help”选项时显示文本文件中的文本。这是我如何尝试的示例:
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("file", type=str, nargs='+')
parser.add_argument("-xmin", type=float)
parser.add_argument("-xmax", type=float)
parser.add_argument("-ymin", type=float)
parser.add_argument("-ymax", type=float)
parser.add_argument("-h", "--help", action="store_true")
args = parser.parse_args()
if args.help is True:
print isip_get_help()
exit(-1)
但它仍然输出:
nedc_[1]: python isip_plot_det.py -h
usage: isip_plot_det.py [-xmin XMIN] [-xmax XMAX] [-ymin YMIN] [-ymax YMAX]
[-h]
file [file ...]
isip_plot_det.py: error: too few arguments
有什么想法吗?
失败是由于缺少必需的参数file
造成的。 action
不受此验证要求的原因很简单,因为它们先执行,即 args.help
将设置为 True
。但是,一旦解析器完成解析参数,它会由于验证失败而触发 sys.exit
,这将以打印出默认用法而结束,并且您的代码(打印您想要的帮助消息)将永远不会执行(您可以尝试使用 -h file
参数按原样调用您的程序,您的帮助消息应该会打印出来)。
您可以使用 parser.register
添加您的自定义操作(未正式支持,因为它被认为是私有的 API,但它有效 - 阅读 argparse.py
了解它是如何工作的),或者子类 ArgumentParser
并覆盖 print_help
方法来调用 isip_get_help()
.
您可以尝试这样的操作:
class MyArgumentParser(argparse.ArgumentParser):
def print_help(self, file=None):
print(isip_get_help())
exit(-1)
parser = MyArgumentParser()
...
保留默认值 add_help
,但覆盖 print_help
以调用您的自定义帮助,它应该可以工作。
您得到的是一条错误消息,而不是帮助(即它不是由您的 -h
生成的)。
isip_plot_det.py: error: too few arguments
错误信息显示的是正常帮助的用法部分。您可以使用 usage
参数更改它:
parser = ArgumentParser(usage = 'my custom usage line')
您还可以使用
测试使用显示parser.print_usage()
或
astr = parser.format_usage()
获取可打印的字符串。
正常的 help
参数使用特殊的 help
动作 class。它的call
方法是:
def __call__(self, parser, namespace, values, option_string=None):
parser.print_help()
parser.exit()
请注意,它显示 parser.print_help()
的帮助,然后退出。一旦它解析 -h
字符串,就会发生这种情况。这样它就不会产生任何错误,如 too few arguments
或 unrecognized arguments
(在解析结束时产生)。
因此自定义帮助的另一种方法是子class ArgumentParser
,并定义您自己的print_help
方法。您还可以自定义 exit
和 error
方法。
默认的print_help
是:
def print_help(self, file=None):
if file is None:
file = sys.stdout
self._print_message(self.format_help(), file)
您可以自定义 format_help
。
class MyParser(argparse.ArgumentParser):
def format_help(self):
return 'my custom help message\n second line\n\n'
示例用法:
In [104]: parser=MyParser(usage='custom usage')
In [105]: parser.parse_args(['-h'])
my custom help message
second line
...
In [106]: parser.parse_args(['unknown'])
usage: custom usage
ipython3: error: unrecognized arguments: unknown
...