ArgumentParser -h不在parse_known_args之后打印选项

时间:2016-03-04 15:31:46

标签: python command-line-arguments argparse

我有一长串可选参数的脚本,我最近添加了通过文件传递参数的选项。代码如下:首先添加from_file args,然后添加parse_known_args。一切都有效,除了-h标志。调用此标志时的输出仅指在parse_known_args调用之前添加的参数。

问题:如何在parse_known_args来电后获取帮助选项以识别所有参数?

# grab values from file_parser or default
def getInitVar(variable, parser, default, varList=False):
    if parser:
        if varList:
            return [o.strip() for o in parser.get('constants',variable).split(",")] if parser.has_option('constants',variable) else default
        else:
            return parser.get('constants',variable) if parser.has_option('constants',variable) else default
    else:
        return default

# first parser for to/from file parameters
parser = argparse.ArgumentParser(
    description='', prefix_chars='-+', formatter_class=argparse.ArgumentDefaultsHelpFormatter)

# Meta variables
group = parser.add_argument_group('Meta Variables', '')
group.add_argument('--to_file', dest='toinitfile', nargs='?', const=DEF_INIT_FILE, default=None,
                  help='write flag values to text file')
group.add_argument('--from_file', type=str, dest='frominitfile', default='',
                   help='reads flag values from file')

args, remaining_argv = parser.parse_known_args()

# create second parser for reading from files
if args.frominitfile:
    conf_parser = SafeConfigParser()
    conf_parser.read(args.frominitfile)
else:
    conf_parser = None

group = parser.add_argument_group('Some Group', 'blah blah')

group.add_argument('-someFlag', dest='somevar', default=getInitVar('corpdb', conf_parser, DEF_VAR),
                    help='Some help.')
....

使用-h标志时的输出:

optional arguments:
-h, --help            show this help message and exit

Meta Variables:
--to_file [TOINITFILE]
                    write flag values to text file (default: None)
--from_file FROMINITFILE
                    reads flag values from file (default: )

编辑:在我的代码中添加了一些详细信息(如评论中所示),说明我调用parse_known_args的原因:

  1. 我创建解析器并添加两个参数:from_fileto_file
  2. 解析参数。如果存在from_file,我创建第二个解析器并读取输入变量。
  3. 继续向解析器添加参数。默认值是我传递第二个解析器和默认值的函数。
  4. 编辑:最后想出了如何做到这一点,发布了以下答案。

2 个答案:

答案 0 :(得分:1)

进行了以下更改:

  1. 使用参数init_parser
  2. 创建add_help=False
  3. init_parser传递给parser作为父母:parents=[init_parser]
  4. 将说明参数从init_parser移至parser
  5. 以下是最终代码:

    init_parser = argparse.ArgumentParser(prefix_chars='-+', formatter_class=argparse.ArgumentDefaultsHelpFormatter, add_help=False)
    
    # Meta variables
    group = init_parser.add_argument_group('Meta Variables', '')
    group.add_argument('--to_file', dest='toinitfile', nargs='?', const=DEF_INIT_FILE, default=None, help='write flag values to text file')
    group.add_argument('--from_file', type=str, dest='frominitfile', default='', help='reads flag values from file')
    
    args, remaining_argv = init_parser.parse_known_args()
    
    if args.frominitfile:
        conf_parser = SafeConfigParser()
        conf_parser.read(args.frominitfile)
    else:
        conf_parser = None
    
    # Inherit options from init_parser
    parser = argparse.ArgumentParser(description='Extract and Manage Language Feature Data.', 
        parents=[init_parser])
    
    group = parser.add_argument_group('Some Group', 'blah blah')
    
    group.add_argument('-someFlag', dest='somevar', default=getInitVar('corpdb', conf_parser, DEF_VAR),
                        help='Some help.')
    ....
    

    输出:

    optional arguments:
        -h, --help            show this help message and exit
    
    Meta Variables:
    --to_file [TOINITFILE]
                    write flag values to text file (default: None)
    --from_file FROMINITFILE
                    reads flag values from file (default: )
    Some group:
        blah blah blah
    --someFlag
    ...
    

答案 1 :(得分:0)

看起来您正在解析输入,并基于某些值,添加更多参数,您将再次解析。正确?

第一次解析正在处理-h。记住它在打印参数后退出。所以它没有进入some group添加,更不用说显示后面的帮助了。

解决此问题的一种方法是使用add_help=False定义第一个解析器,因此第一个parse_know_args不会处理-h

现在将自己的-h参数添加到解析器中(尝试action='help');或重新创建解析器。无论哪种方式,第二个解析步骤都将作用于-h