【问题标题】:Python argparser repeat subparsePython argparse 重复子解析器
【发布时间】:2013-10-07 12:32:13
【问题描述】:

我正在使用 pythons(2.7.2) argparse (1.1) 来解析命令行,我想要的是创建子解析器并可以多次输入子解析器命令。像这样:

./script.py version 1 --file 1 2 3 version 3 --file 4 5 6

有可能创造这样的东西吗?因为现在当我尝试在结果命名空间中运行带有此类参数的脚本时,get:

Namespace(file=['4', '5', '6'], n=[1])

n 它是一个版本号。所以我得到了第一个版本号和第二个文件列表,而不是文件列表和版本。

【问题讨论】:

  • 您能在问题中包含您当前的代码吗?

标签: python argparse


【解决方案1】:

对于主解析器,子解析器参数是一个可以选择的位置。但它也将所有剩余的参数字符串分配给子解析器。

我希望你的字符串被解析如下:

./script.py version 1 --file 1 2 3 version 3 --file 4 5 6

version 被接受为子解析器名称。 1 被接受为位置参数n 的值。 (子解析器的)。 --file 被接受为可选参数(由子解析器)。第二次调用的值会覆盖第一次调用的值。我猜--file 有nargs='*'。如果是这样,第一个将['1','2','3','version','3'] 写入命名空间,而第二个用['4','5','6'] 覆盖它。如果是nargs=3,我希望子解析器会阻塞第二个version,它会认为这是一个未知的位置。

所以基本点是 - 一旦“版本”子解析器获得参数列表,它不会放手,直到它解析了它可以解析的所有内容。在这种情况下,它会解析两个 --file 事件。任何它无法处理的东西都会作为“未知”返回到主解析器,这通常会引发错误。


如果您想要来自重复选项的值,请使用附加操作

parser.add_argument('--foo',action='append', nargs=3)

import argparse
parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='version')
spp = sp.add_parser('version')
spp.add_argument('n',nargs='*',type=int)
spp.add_argument('--file',nargs=3,action='append')
str = 'version 1 --file 1 2 3 version 3 --file 4 5 6'
print(parser.parse_known_args(str.split()))

生产

(Namespace(file=[['1', '2', '3'], ['4', '5', '6']], n=[1], version='version'), ['version', '3'])

仍然只有一次调用 version 子解析器,但所有数据都存在。


另一种方法是嵌套子解析器

parser = argparse.ArgumentParser()
sp = parser.add_subparsers(dest='sub')
spp = sp.add_parser('version')
spp.add_argument('n',nargs=1,type=int)
spp.add_argument('--file',nargs=3)

sp = spp.add_subparsers(dest='sub1')
spp = sp.add_parser('version')
spp.add_argument('n1',nargs=1,type=int)
spp.add_argument('--file',dest='file1',nargs=3)

str = 'version 1 --file 1 2 3 version 3 --file 4 5 6'
print(parser.parse_args(str.split()))

请注意,我必须更改“dest”以避免过度写入值。这会产生

Namespace(file=['1', '2', '3'], file1=['4', '5', '6'], n=[1], n1=[3], sub='version', sub1='version')

【讨论】:

    猜你喜欢
    • 2018-12-31
    • 1970-01-01
    • 2013-12-21
    • 2012-01-05
    • 2015-07-17
    • 2018-01-04
    • 2017-12-02
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多