按位解析argparse输入

3
我正在使用Argparse来解析我的Python函数的shell输入。但麻烦的是,该脚本首先读入一个文件,该文件部分地确定了Argparse可用的参数类型(它是一个包含用户指定输出数据标准的JSON文件)。但在将这些参数添加到我的解析器之前,我想先读取一些与文件读取本身相关的参数(例如是否修复输入文件的格式)。有点像这样:
test.py (fix_formatting=True, **more arguments added later)

当我尝试在初始输入和添加更多键后两次运行args = parser.parse_args()时,事情就会变得混乱:Argparse会非常可预见地抱怨一些用户输入是未识别的参数:。我想我可以使用subparsers来达到这个目的。

因此,我尝试了各种变化(尽可能按照文档中的示例):

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”部分,如下所示:
    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 会抱怨我做出了“无效选择:[…](从 'settings' 中选择)”。现在我不明白为什么我必须从 "settings" 中选择;文档说解析

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

  • 我在这里理解错了什么?

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

非常感谢您的任何帮助!

1个回答

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 = parser.add_argument('cmd', choices=['select',...])

换句话说,它添加了一个位置参数,其中choices是您定义的子解析器名称。这可能有助于您了解为什么它需要您命名select。通常需要位置参数。
(最近的某些版本有一个例外情况,详情请参见此处

非常感谢!我想我完全误解了子解析器和部分解析的概念。感谢您的澄清... - patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接