我想使用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
有什么想法吗?
答案 0 :(得分:10)
你得到的是错误信息,而不是帮助(即它不是由-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
操作类。它的call
方法是:
def __call__(self, parser, namespace, values, option_string=None):
parser.print_help()
parser.exit()
请注意,它会显示parser.print_help()
的帮助,然后退出。只要它解析-h
字符串就会发生这种情况。这样它就不会产生任何错误,例如too few arguments
或unrecognized arguments
(在解析结束时产生)。
另一种自定义帮助的方法是继承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
...
答案 1 :(得分:1)
失败是由缺少必需参数file
引起的。 action
不受此验证要求的原因仅仅是因为它们首先被执行,即,args.help
将被设置为True
。但是,一旦解析器完成解析参数,它就会因验证失败而触发sys.exit
,最终会打印出默认用法,而您的代码(打印出所需的帮助消息)将永远不会被执行(您可以尝试使用-h file
参数调用您的程序,并打印您的帮助信息。
您可以使用parser.register
添加您的自定义操作(由于它被认为是私有API而未正式支持,但它可以正常工作 - 阅读argparse.py
以查看它是如何工作的),或者是子类{{1并覆盖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
以调用自定义帮助时,它应该有效。