我使用阿格帕斯解析我的Python函数的shell输入。
棘手的部分是,这个脚本首先读取一个文件,该文件部分地确定哪种参数可以用于Argparse (它是一个JSON文件,包含用户可以指定输出哪些数据的条件)。
但是在将这些参数添加到我的解析器之前,我想阅读一些与文件读取本身有关的参数。(例如,是否修复输入文件的格式)。就像这样:
test.py (fix_formatting=True, **more arguments added later)当我尝试两次运行args = parser.parse_args()时,在初始输入之后和添加了更多的键之后,事情就会分崩离析: Argparse相当不出所料地抱怨说,一些用户输入是unrecognized arguments:。我想我可以用子解析器来达到这个目的。
因此,我尝试了(尽可能地遵循文档中的示例)的变体:
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')。现在我不明白为什么我必须从“设置”中选择;文档说解析
将只包含命令行选择的主分析器和子解析器的属性(而不是任何其他子解析器)。
任何帮助都是非常感谢的!
发布于 2016-06-15 02:08:04
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。通常需要位置词。
(在最近的版本中,有一个例外,https://stackoverflow.com/a/22994500/901925)
https://stackoverflow.com/questions/37824316
复制相似问题