使用 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 个或多个字符串。它相应地拆分了长列表,给 arg2arg3 每个(满足他们的要求),并将其余分配给 arg1。如果你熟悉 regex,这相当于

In [96]: re.match('(A+)(A+)(A+)','AAAAAAAAA').groups()
Out[96]: ('AAAAAAA', 'A', 'A')

(解析器无法读懂您的想法并将所有“arg2”分配给 args2 只是因为名称看起来相似。:))

因此,如果您需要以特定方式拆分参数列表,那么 optionals(标志)是可行的方法。在 nargsrequired 之间,您对数字有相当大的控制权。

我添加了 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