如何使用argparse(python)处理可选和强制的位置参数



我一直试图执行我的python脚本与一些参数传递。我希望它是这样的:

python script.py filepath

还要支持这个

python script.py filepath1 filepath2

我的实现是:

parser = argparse.ArgumentParser()
mand = parser.add_argument_group("Mandatory arguments")
mand.add_argument("path1", help = "path1")
opt = parser.add_argument_group("Optional arguments")
opt.add_argument("path2", help = "path2")
args = parser.parse_args()

似乎需要两个参数。谁有什么建议,什么是正确的方式来做到这一点?我的一个想法是做两个论证组;一个有路径1,另一个有两个路径,但它仍然请求了两个路径。

谢谢大家!

注:Python 2.7

使用nargs="?" (with argparse)

import argparse
parser = argparse.ArgumentParser()
mand = parser.add_argument_group("Mandatory arguments")
mand.add_argument("path1", help = "path1")
opt = parser.add_argument_group("Optional arguments")
opt.add_argument("path2", help = "path2", nargs="?")
args = parser.parse_args()
print args

参见用法string:

$ python argscript.py 
usage: argscript.py [-h] path1 [path2]
argscript.py: error: too few arguments

或与-h:

$ python argscript.py -h
usage: argscript.py [-h] path1 [path2]
optional arguments:
  -h, --help  show this help message and exit
Mandatory arguments:
  path1       path1
Optional arguments:
  path2       path2

并尝试只使用一个位置参数:

$ python argscript.py alfa
Namespace(path1='alfa', path2=None)

和两个:

$ python argscript.py alfa beta
Namespace(path1='alfa', path2='beta')

对不起,我的回答有点离题。我更喜欢用docopt,所以如果你感兴趣的话。

使用docopt

先安装docopt:

$ pip install docopt

和脚本:

"""script.py
Usage:
    script.py <fname>...
"""
if __name__ == "__main__":
    from docopt import docopt
    args = docopt(__doc__)
    print args

你可以这样使用:

请求使用脚本:

$ python script.py 
Usage:
    script.py <fname>...

用一个文件名调用:

$ python script.py alfa
{'<fname>': ['alfa']}

与两个名称连用:

$ python script.py alfa beta
{'<fname>': ['alfa', 'beta']}

使用不同的用法说明:

允许有一个或两个文件名,但不能有三个或更多:

"""script.py
Usage:
    script.py <input> [<output>]
"""
if __name__ == "__main__":
    from docopt import docopt
    args = docopt(__doc__)
    print args

最新更新