gpt4 book ai didi

python - 逐位解析 argparse 输入

转载 作者:行者123 更新时间:2023-11-28 16:24:13 30 4
gpt4 key购买 nike

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

棘手的部分是此脚本首先读取一个文件,该文件部分确定了 Argparse 可用的参数类型(这是一个 JSON 文件,其中包含用户可以指定要输出的数据的标准)。

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

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

当我尝试运行 args = parser.parse_args() 两次时,在初始输入之后和添加更多键之后,事情分崩离析:Argparse 完全可以预见地提示一些用户输入是 无法识别的参数:。我想我可能会使用 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 会提示我做了一个无效的选择:[...](从“设置”中选择)。现在我不明白为什么我必须从“设置”中进行选择;文档说解析

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。这将返回 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。通常需要位置。

(在最近的版本中有一个异常(exception),https://stackoverflow.com/a/22994500/901925)

关于python - 逐位解析 argparse 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37824316/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com