使用 argparse 管理多个后续位置参数
Manage multiple following positional argument with argparse
我正在使用这个库来解析 python 中的参数:https://docs.python.org/2/library/argparse.html
到目前为止我有这个:
prog arg1 [-s arg2 [arg2 ...]] [-m arg3 [arg3 ...]]
我想要这个:
prog arg1 -s arg2 [arg2 ...] -m arg3 [arg3 ...]
这是我的 python 代码:
parser = argparse.ArgumentParser()
parser.add_argument('path', type=str,
help="path used for the generation of the rouge files")
parser.add_argument('-s', '--systems', type=str, nargs='+',
help="path to the systems generated summary files")
parser.add_argument('-m', '--models', type=str, nargs='+',
help="path to the reference summary files")
args = parser.parse_args()
print args
问题是当你调用没有可选参数的程序时,它不会给出错误(参数太少)。我希望我的可选参数是强制性的,但是当您进行以下调用时,解析器无法确定涉及哪种类型的参数...
例如以下代码:
parser = argparse.ArgumentParser()
parser.add_argument('arg1', type=str, nargs='+')
parser.add_argument('arg2', type=str, nargs='+')
parser.add_argument('arg3', type=str, nargs='+')
args = parser.parse_args()
以及以下调用:
python test.py arg1 arg1 arg1 arg2 arg2 arg3 arg3
我知道了:
Namespace(arg1=['arg1', 'arg1', 'arg1', 'arg2', 'arg2'], arg2=['arg3'], arg3=['arg3'])
当然这是这个程序的格式:
prog arg1 [arg1 ...] arg2 [arg2 ...] arg3
感谢您的帮助:)
你想要的是不可能的。想一想:如果您要在没有 argparse
的情况下实现自己的参数解析,您将如何确定位置参数是 arg1
参数列表的最后一个,还是 [=12] 的第一个=] 参数?
我认为您知道的解决方案(可选参数)工作正常,甚至更可取。
optionals
可以带一个 required=True
参数。这可能就是您所需要的。
p=argparse.ArgumentParser()
p.add_argument('-m',nargs='+',required=True)
p.add_argument('-n',nargs='+',required=True)
p.print_usage()
生产
usage: ipython3 [-h] -m M [M ...] -n N [N ...]
至于为什么:
Namespace(arg1=['arg1', 'arg1', 'arg1', 'arg2', 'arg2'], arg2=['arg3'], arg3=['arg3'])
您指定每个 arg1, arg2, arg3
需要 1 个或多个字符串。它相应地拆分了长列表,给 arg2
和 arg3
每个(满足他们的要求),并将其余分配给 arg1
。如果你熟悉 regex
,这相当于
In [96]: re.match('(A+)(A+)(A+)','AAAAAAAAA').groups()
Out[96]: ('AAAAAAA', 'A', 'A')
(解析器无法读懂您的想法并将所有“arg2”分配给 args2
只是因为名称看起来相似。:))
因此,如果您需要以特定方式拆分参数列表,那么 optionals
(标志)是可行的方法。在 nargs
和 required
之间,您对数字有相当大的控制权。
我添加了 require=True 并且成功了,感谢 hpaulj
parser = argparse.ArgumentParser()
parser.add_argument('path', type=str,
help="path used for the generation of the rouge files")
parser.add_argument('-s', '--systems', type=str, nargs='+', required=True,
help="path to the systems generated summary files")
parser.add_argument('-m', '--models', type=str, nargs='+', required=True,
help="path to the reference summary files")
args = parser.parse_args()
python summary2rouge.py
usage: summary2rouge.py [-h] -s SYSTEMS [SYSTEMS ...] -m MODELS [MODELS ...]
path
summary2rouge.py: error: too few arguments
我正在使用这个库来解析 python 中的参数:https://docs.python.org/2/library/argparse.html
到目前为止我有这个:
prog arg1 [-s arg2 [arg2 ...]] [-m arg3 [arg3 ...]]
我想要这个:
prog arg1 -s arg2 [arg2 ...] -m arg3 [arg3 ...]
这是我的 python 代码:
parser = argparse.ArgumentParser()
parser.add_argument('path', type=str,
help="path used for the generation of the rouge files")
parser.add_argument('-s', '--systems', type=str, nargs='+',
help="path to the systems generated summary files")
parser.add_argument('-m', '--models', type=str, nargs='+',
help="path to the reference summary files")
args = parser.parse_args()
print args
问题是当你调用没有可选参数的程序时,它不会给出错误(参数太少)。我希望我的可选参数是强制性的,但是当您进行以下调用时,解析器无法确定涉及哪种类型的参数...
例如以下代码:
parser = argparse.ArgumentParser()
parser.add_argument('arg1', type=str, nargs='+')
parser.add_argument('arg2', type=str, nargs='+')
parser.add_argument('arg3', type=str, nargs='+')
args = parser.parse_args()
以及以下调用:
python test.py arg1 arg1 arg1 arg2 arg2 arg3 arg3
我知道了:
Namespace(arg1=['arg1', 'arg1', 'arg1', 'arg2', 'arg2'], arg2=['arg3'], arg3=['arg3'])
当然这是这个程序的格式:
prog arg1 [arg1 ...] arg2 [arg2 ...] arg3
感谢您的帮助:)
你想要的是不可能的。想一想:如果您要在没有 argparse
的情况下实现自己的参数解析,您将如何确定位置参数是 arg1
参数列表的最后一个,还是 [=12] 的第一个=] 参数?
我认为您知道的解决方案(可选参数)工作正常,甚至更可取。
optionals
可以带一个 required=True
参数。这可能就是您所需要的。
p=argparse.ArgumentParser()
p.add_argument('-m',nargs='+',required=True)
p.add_argument('-n',nargs='+',required=True)
p.print_usage()
生产
usage: ipython3 [-h] -m M [M ...] -n N [N ...]
至于为什么:
Namespace(arg1=['arg1', 'arg1', 'arg1', 'arg2', 'arg2'], arg2=['arg3'], arg3=['arg3'])
您指定每个 arg1, arg2, arg3
需要 1 个或多个字符串。它相应地拆分了长列表,给 arg2
和 arg3
每个(满足他们的要求),并将其余分配给 arg1
。如果你熟悉 regex
,这相当于
In [96]: re.match('(A+)(A+)(A+)','AAAAAAAAA').groups()
Out[96]: ('AAAAAAA', 'A', 'A')
(解析器无法读懂您的想法并将所有“arg2”分配给 args2
只是因为名称看起来相似。:))
因此,如果您需要以特定方式拆分参数列表,那么 optionals
(标志)是可行的方法。在 nargs
和 required
之间,您对数字有相当大的控制权。
我添加了 require=True 并且成功了,感谢 hpaulj
parser = argparse.ArgumentParser()
parser.add_argument('path', type=str,
help="path used for the generation of the rouge files")
parser.add_argument('-s', '--systems', type=str, nargs='+', required=True,
help="path to the systems generated summary files")
parser.add_argument('-m', '--models', type=str, nargs='+', required=True,
help="path to the reference summary files")
args = parser.parse_args()
python summary2rouge.py
usage: summary2rouge.py [-h] -s SYSTEMS [SYSTEMS ...] -m MODELS [MODELS ...]
path
summary2rouge.py: error: too few arguments