Python argparser repeat子parse

Python argparser repeat子parse,python,argparse,Python,Argparse,我正在使用pythons(2.7.2)argparse(1.1)来解析命令行,我想要的是创建subparser并使多次输入subparser命令成为可能。像这样: ./script.py version 1 --file 1 2 3 version 3 --file 4 5 6 有可能创造这样的东西吗?因为现在,当我尝试在result namespase a get中运行带有此类参数的脚本时: Namespace(file=['4', '5', '6'], n=[1]) n它是一个版本号。因

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

./script.py version 1 --file 1 2 3 version 3 --file 4 5 6
有可能创造这样的东西吗?因为现在,当我尝试在result namespase a get中运行带有此类参数的脚本时:

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

n它是一个版本号。因此,我得到的是第一个版本号和第二个文件列表,而不是文件列表和版本。

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

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

./script.py version 1 --file 1 2 3 version 3 --file 4 5 6
version
被接受为子帕瑟名称
1
被接受为位置参数
n
的值。(指副检察官)
--file
被接受为可选参数(由子parser)。第二次调用的值覆盖第一次调用的值。我猜
--文件
nargs='*'
。如果是这样,第一个将
['1','2','3','version','3']
写入命名空间,而第二个将用
['4','5','6']
覆盖它。如果
nargs=3
,我希望潜艇在第二个
版本
上阻塞,它会将其视为未知位置

因此,基本要点是——一旦“version”子parser获得参数列表,它就不会放弃,直到它解析了它所能解析的所有内容。在本例中,它解析两个
--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
subparser,但所有数据都存在


另一种方法是嵌套次parser

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')

你能在问题中包括你当前的代码吗?