当参数数量超过阈值时,Python argparse AssertionError [英] Python argparse AssertionError when number of arguments exceeds threshold

查看:68
本文介绍了当参数数量超过阈值时,Python argparse AssertionError的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写带有很多参数的Python脚本,我希望使用argparse模块将其分解为清晰的组,如下所示:

I'm trying to write a Python script with a lot of arguments that I'd like to break up into clear groups using the argparse module as follows:

import argparse
parser = argparse.ArgumentParser(description='Placeholder text', add_help=False)
req = parser.add_argument_group('required arguments')
req.add_argument('-m','--mode', action='store', dest='mode', help='Operation mode', choices=['single', 'multi'], required=True, metavar='')
req.add_argument('-s','--snps', action='store', dest='snps', help='SNP BED file', required=True, metavar='')
req.add_argument('-r','--reads', action='store', dest='reads', help='Mapped reads file [sam or bam]', required=True, metavar='')
uni = parser.add_argument_group('universal optional arguments')
uni.add_argument('-p','--prefix', action='store', dest='prefix', help='Prefix for temp files and output [Default: TEST]', default='TEST', metavar='')
uni.add_argument('-b','--bam', action='store_true', dest='bam', help='Mapped read file type is bam (auto-detected if *.bam)')
uni.add_argument('-t','--single', action='store_true', dest='single', help='Mapped reads are single-end [Default: False]')
uni.add_argument('-n','--noclean', action='store_true', dest='noclean', help='Do not delete intermediate files (for debuging)')
uni.add_argument('-h', '--help', action='help', help='show this help message and exit')
mult = parser.add_argument_group('multi(plex) mode arguments')
mult.add_argument('-j','--jobs', action='store', dest='jobs', type=int, help='Divide into # of jobs [Default: 100]', default=100, metavar='')
mult.add_argument('-w','--walltime', action='store', dest='walltime', help='Walltime for each job [Default: 3:00:00]', default='3:00:00', metavar='')
mult.add_argument('-k','--mem', action='store', dest='memory', help='Memory for each job [Default: 5000MB]', default='5000MB', metavar='')
single = parser.add_argument_group('single mode arguments')
single.add_argument('-f','--suffix', action='store', dest='suff', help='Suffix for multiplexed files [set automatically]', default='', metavar='')

args = parser.parse_args()

但是,当我运行脚本时,使用'-h'选项,而不是打印帮助文本,它会显示以下错误:

However, when I run this script, with the '-h' option, instead of printing the help text, it spits out the following error:

Traceback (most recent call last):
  File "CountSNPLevelASE.py", line 61, in <module>
    args = parser.parse_args()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 1688, in parse_args
    args, argv = self.parse_known_args(args, namespace)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 1720, in parse_known_args
    namespace, args = self._parse_known_args(args, namespace)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 1926, in _parse_known_args
    start_index = consume_optional(start_index)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 1866, in consume_optional
    take_action(action, args, option_string)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 1794, in take_action
    action(self, namespace, argument_values, option_string)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 994, in __call__
    parser.print_help()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 2327, in print_help
    self._print_message(self.format_help(), file)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 2301, in format_help
    return formatter.format_help()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 279, in format_help
    help = self._root_section.format_help()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 209, in format_help
    func(*args)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.py", line 330, in _format_usage
    assert ' '.join(opt_parts) == opt_usage
AssertionError

奇怪的是,如果我注释掉任何不需要的参数,我将得到正确的帮助文本输出,如下所示:

The odd thing is that if I comment out ANY of the non-required arguments, I get the proper help text output, like this:

usage: CountSNPLevelASE.py -m  -s  -r  [-b] [-t] [-n] [-h] [-j] [-w] [-k] [-f]

Placeholder text

required arguments:
  -m , --mode       Operation mode
  -s , --snps       SNP BED file
  -r , --reads      Mapped reads file [sam or bam]

universal optional arguments:
  -b, --bam         Mapped read file type is bam (auto-detected if *.bam)
  -t, --single      Mapped reads are single-end [Default: False]
  -n, --noclean     Do not delete intermediate files (for debuging)
  -h, --help        show this help message and exit

multi(plex) mode arguments:
  -j , --jobs       Divide into # of jobs [Default: 100]
  -w , --walltime   Walltime for each job [Default: 3:00:00]
  -k , --mem        Memory for each job [Default: 5000MB]

single mode arguments:
  -f , --suffix     Suffix for multiplexed files [set automatically]

我找不到明确的解释为什么会发生这种情况.我试着删除所有空格都无济于事.有任何想法吗? (如果有帮助,我将在Mac OS X 10.10.2上使用Python 2.7.6).

I can't find a clear explanation for why this is happening. I've tried removing all whitespace to no avail. Any ideas? (I'm using Python 2.7.6 on Mac OS X 10.10.2 if that's helpful).

推荐答案

问题在于包装用法.当usage放在一行中时,它显示正常,但将其拆分为2时失败.

The problem lies in wrapping the usage. It displays fine when usage fits on one line, but fails when it splits it into 2.

存在一个与此assertion有关的已知错误问题.使用情况格式代码易碎,当使用情况中有常用"字符(包括多余的空格)时,会引发此assertion错误.

There's a known bug issue involving this assertion. The usage formatting code is fragile, and can raise this assertion error when there are 'usual' characters in the usage, including and extra spaces.

给出问题的3个必需参数中的metavar=''.可选的可选参数可以有一个'metavar.

It's the metavar='' of the 3 required arguments that's giving the problem. The optional optionals can have a '' metavar.

在简短用法行中注意到这些参数之间的双倍空格吗?

Notice the double spaces between these arguments in the short usage line?

...py -m  -s  -r  [-b]...

assertion error是这些空格未通过包装代码完整保留的结果.

The assertion error is the result of those spaces not making it through the wrapping code intact.

如果找不到适合这3个参数的替代元变量,那么我们将不得不弄清楚如何修改您的argparse代码.可能包括注释断言语句,或从一行用法中删除那些多余的空白.最大的解决方法是更强大的用法格式化程序.

If you can't find suitable alternative metavars for those 3 arguments, then we'll have to figure out how to modify your argparse code. Possibilities include commenting out the assertion statement, or trimming out those extra blanks from the one line usage. The big fix is a more robust usage formatter.

这篇关于当参数数量超过阈值时,Python argparse AssertionError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆