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

时间:2014-07-18 07:33:29

标签: python command-line-arguments argparse

我一直试图通过传递一些参数来执行我的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()

似乎要求两个论点。有没有人有任何关于这样做的正确方法的建议?我的一个想法是做两个论点组;一个是path1而另一个是两个路径,但它仍然要求两个。

谢谢你们和女孩们!

P.S。 Python 2.7

2 个答案:

答案 0 :(得分:3)

使用nargs="?"(使用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

参见用法字符串:

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

答案 1 :(得分:1)

对不起有点主题回答。我更喜欢使用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