逐位解析 argparse 输入

Parsing argparse input bit by bit

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

棘手的部分是此脚本首先读取一个文件,该文件部分确定了 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" 部分,如下所示:

    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')。现在我不明白为什么我必须选择 "settings";文档说 parse

will only contain attributes for the main parser and the subparser that was selected by the command line (and not any other subparsers)

非常感谢任何帮助!

parse_args 呼叫 parse_known_args。 returns args namesparse 以及它无法处理的字符串列表(来自 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。通常需要位置。

(最近版本有例外,)