我正在使用pythons(2.7.2)argparse(1.1)来解析命令行,我想要的是创建子解析器并使其可以多次输入子解析器命令。像这样:
./script.py version 1 --file 1 2 3 version 3 --file 4 5 6
Run Code Online (Sandbox Code Playgroud)
有可能创造这样的东西吗?因为现在当我尝试在结果名称中运行带有此类参数的脚本时,请获取:
Namespace(file=['4', '5', '6'], n=[1])
Run Code Online (Sandbox Code Playgroud)
n是版本号。所以我得到了文件的第一个版本号和第二个列表,而不是文件列表和版本。
对于主解析器,subparsers参数是一个接受选择的位置。但是,它还将所有剩余的参数字符串分配给子解析器。
我希望您的字符串解析如下:
./script.py version 1 --file 1 2 3 version 3 --file 4 5 6
Run Code Online (Sandbox Code Playgroud)
version被接受为子解析器名称。 1被接受为位置论证的价值n。(子分析器的)。--file被子解析器接受为可选参数。第二次调用的值将覆盖第一个调用的值。我猜--file有nargs='*'。如果是这样,则第一个写入['1','2','3','version','3']名称空间,而第二个覆盖['4','5','6']。如果为nargs=3,则我希望子解析器在第二个阻塞version,它会被视为未知位置。
因此,基本要点是-一旦“版本”子解析器获得了参数列表,它就不会放手,直到它解析了所有可以解析的内容。在这种情况下,它解析两个--file事件。它无法处理的所有内容都会以“ UNKNOWNS”的形式返回主解析器,这通常会引发错误。
如果需要重复的可选值,请使用追加操作
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()))
Run Code Online (Sandbox Code Playgroud)
产生
(Namespace(file=[['1', '2', '3'], ['4', '5', '6']], n=[1], version='version'), ['version', '3'])
Run Code Online (Sandbox Code Playgroud)
仍然只有一个调用子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()))
Run Code Online (Sandbox Code Playgroud)
请注意,我必须更改“目标”以避免覆盖值。这产生
Namespace(file=['1', '2', '3'], file1=['4', '5', '6'], n=[1], n1=[3], sub='version', sub1='version')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1720 次 |
| 最近记录: |