逐位解析 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
。通常需要位置。
(最近版本有例外,)
我正在使用 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
。通常需要位置。
(最近版本有例外,)