【问题标题】:How to handle optional and mandatory positional arguments with argparse(python)如何使用 argparse(python) 处理可选和强制位置参数
【发布时间】:2014-09-09 06:29:39
【问题描述】:

我一直在尝试通过传递一些参数来执行我的 python 脚本。我想要的方式是这样的:

python script.py 文件路径

还要支持这个

python script.py 文件路径1 文件路径2

我的实现是:

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,另一个带有两个路径,但它仍然请求两者。

谢谢大家!

附: Python 2.7

【问题讨论】:

  • 那些参数组只会影响help 的显示方式。它们不影响解析。对于位置参数,nargs 参数决定了它需要多少个值。它还控制usage 的显示。

标签: python command-line-arguments argparse


【解决方案1】:

使用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')

【讨论】:

  • 太棒了。谢谢!这样就很容易理解了
【解决方案2】:

抱歉,回答有点离题。我更喜欢使用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

【讨论】:

  • 没关系,只要给帖子增加知识就行。但是我忘了提到一个约束。我无法安装库。 (但我会保留它以供将来个人使用)
  • @MayTheSchwartzBeWithYou 您的约束隐含在using argparse 中。顺便说一句,您没有 root 权限,您仍然可以安装到用户方案中(使用pip install --user &lt;packagename&gt; 或最好安装到 virtualenv 中。但这是另一个主题。可能还有其他原因(例如在任何使用纯 Python 的机器上都可以轻松运行) .
  • 是的,我知道,但该工具将被 100 人使用。我必须将它运行到最低限度的依赖关系。
猜你喜欢
  • 2018-04-29
  • 2017-01-14
  • 2014-04-15
  • 2012-08-14
  • 2013-01-28
  • 2011-05-27
  • 1970-01-01
相关资源
最近更新 更多