来自文本文件的Argparse自定义帮助

时间:2015-11-25 00:33:58

标签: python parsing arguments argparse

我想使用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

有什么想法吗?

2 个答案:

答案 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 argumentsunrecognized arguments(在解析结束时产生)。

另一种自定义帮助的方法是继承ArgumentParser,并定义自己的print_help方法。您还可以自定义exiterror方法。

默认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以调用自定义帮助时,它应该有效。