问题描述
我正在尝试编写带有很多参数的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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!