【问题标题】:Parsing argparse input bit by bit逐位解析argparse输入
【发布时间】:2016-06-15 11:24:48
【问题描述】:

我正在使用 Argparse 来解析我的 Python 函数的 shell 输入。

棘手的部分是此脚本首先读取一个文件,该文件部分确定 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')。现在我不明白为什么我必须从“设置”中进行选择;文档说解析

将只包含由命令行选择的主解析器和子解析器的属性(而不是任何其他子解析器)

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

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

非常感谢任何帮助!

【问题讨论】:

    标签: python parsing parameter-passing argparse


    【解决方案1】:

    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

    【讨论】:

    • 非常感谢!我想我完全误解了子解析器和部分解析的概念。感谢您的澄清...
    猜你喜欢
    • 1970-01-01
    • 2018-12-22
    • 2013-12-04
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多