2016-06-15 64 views
3

我正在使用Argparse解析shell输入到我的Python函数。按位解析argparse输入

棘手的部分是,该脚本首先读入一个文件,该文件部分确定Argparse可用的参数类型(它是包含用于指定要输出的数据的条件的JSON文件)。

但是在将这些参数添加到我的解析器之前,我想阅读一些与读取文件相关的参数。 (例如是否修复输入文件的格式)。有点儿像这样:

test.py (fix_formatting=True, **more arguments added later) 

当我尝试运行args = parser.parse_args()两倍,初始输入后,加入更多的键后,事情土崩瓦解:Argparse相当可预见的抱怨,一些用户输入的是unrecognized arguments:。我想我可能会用subparsers来达到目的。

于是,我的变化(以下在docs是最好的,我可以的例子):

def main(): 
    parser = argparse.ArgumentParser() 
    subparsers = parser.add_subparsers(help='sub-command help') 
    settingsparser = subparsers.add_parser('settings') #i want a subparser called 'settings' 
    settingsparser.add_argument('--fix_formatting', action='store_true') #this subparser shall have a --fix_formatting 

然后,我只尝试解析“设置”部分,像这样:

settings=parser.parse_args(['settings']) 

这似乎工作。但后来我加我的其他按键,事情打破:

keys=['alpha','beta','gamma','delta'] 
    for key in keys: 
     parser.add_argument("--"+key, type=str, help="X") 
    args = parser.parse_args() 

如果我解析任何从键参数中的任何输入,Argparse抱怨我做的invalid choice: [...] (choose from 'settings')。现在我不明白为什么我必须从“设置”中进行选择;该文件说,该分析

将只包含这是通过在命令行中选择(而不是任何其他subparsers)主分析器和子分析器属性

  • 什么是我的错误在这里了解?

  • 如果这是错误的方法,如何解决一位输入之前的另一位呢?

任何帮助非常感谢!

回答

3

parse_args来电parse_known_args。这将返回args名称解析以及无法处理的字符串列表(从sys.argv)(extras)。如果此列表不为空,则parse_args会引发此错误。

https://docs.python.org/3/library/argparse.html#partial-parsing

因此,如果要分析一些输入的parse_known_args是有用的。

sys.argv保持不变。随后调用解析器(无论是否是原始解析器)再次使用该解析器,除非您通过extras

我不认为subparsers在这里帮助你。它们不适用于延迟或两阶段解析。我建议首先使用子分析器的文档示例。


到主分析器中,subparsers样子

subparsers = parser.add_argument('cmd', choices=['select',...]) 

换句话说,它增加了在choices是你定义的子分析器名称的位置参数。这可能会帮助你明白为什么它期望你命名为select。定位通常是必需的。

(这是近期版本中的一个例外,https://stackoverflow.com/a/22994500/901925

+0

非常感谢!我想我完全误解了subparsers的概念以及部分解析。感谢澄清... – patrick