Argparse无法识别和错误处理

时间:2012-09-20 06:27:37

标签: python argparse

我使用argparse时遇到了一些问题。我希望在命令行中定义一组名称,这些名称将影响程序的行为。我尝试了以下代码段:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("allon", action='store_true', default = False,
                    help="Toggles all output pins to ON.")
parser.add_argument("alloff",action='store_true',
                    help="Toggles all output pins to OFF.")
parser.add_argument("cont", action='store_true',
                    help="Toggles all output pins continously on and off.")
args = parser.parse_args()

if args.allon:
   do_allon()
elif args.alloff:
    do_alloff()
....

但代码的行为是预期的。我不想对这些选项使用' - ',因为我想调用我的代码git status(没有前导' - ')。

首先,如果我调用没有参数的代码,所有参数都设置为True,而我希望它们在没有给出时设置为False。预期的行为如下:当呼叫为

python code.py

我希望将allon, alloffcont设置为False,而将其称为

python code.py alloff

我希望alloncontFalsealloff设置为True

其次,当我打电话时,例如python code.py allon我得到了

code.py: error: unrecognized arguments: allon

我根本不明白。我知道如何使用optparse,但是非常感谢argparse的帮助以使上述代码片段正常工作。

由于   亚历

P.S。 if循环只是教育性的,而不是以这种方式实现。

4 个答案:

答案 0 :(得分:6)

当您看到git statusgit commit等命令模式时,我们正在谈论sub-commands。要创建子命令,argparse允许您使用子解析器,它们基​​本上就像主解析器一样(采用命令行开关等)。

像这样定义它们:

import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='sub-command help')

allon_parser = subparsers.add_parser('allon',
    help='Toggles all output pins to ON.')
allon_parser.set_defaults(func=do_allon)

alloff_parser = subparsers.add_parser('alloff',
    help="Toggles all output pins to OFF.")
alloff_parser.set_defaults(func=do_alloff)

cont_parser = subparsers.add_parser('cont',
    help="Toggles all output pins continously on and off.")
cont_parser.set_defaults(func=do_cont)

args = parser.parse_args()
# Call the associated `func` function
args.func()

我已将一个函数与每个subparser(set_defaults(func=...))相关联,因此args结构将具有指向所定义函数之一的func属性。我们只需要调用它。

--help的输出:

usage: PROG [-h] {cont,alloff,allon} ...

positional arguments:
  {cont,alloff,allon}  sub-command help
    allon              Toggles all output pins to ON.
    alloff             Toggles all output pins to OFF.
    cont               Toggles all output pins continously on and off.

optional arguments:
  -h, --help           show this help message and exit

答案 1 :(得分:1)

选项通常使用前导-指定短参数(1个字符)或前导--表示长参数。

因此,您应该为可选参数提供两个前导破折号:

import argparse
parser = argparse.ArgumentParser()
# Note that `default=False` is unnecessary since it's implied by `store_true`.
parser.add_argument("--allon", action='store_true',
                    help="Toggles all output pins to ON.")
parser.add_argument("--alloff",action='store_true',
                    help="Toggles all output pins to OFF.")
parser.add_argument("--cont", action='store_true',
                    help="Toggles all output pins continously on and off.")
args = parser.parse_args()

if args.allon:
    do_allon()
elif args.alloff:
    do_alloff()
....

答案 2 :(得分:1)

如果你想强制你的函数的第一个参数,并限制可用的选择,那就这样做:

import argparse
parser = argparse.ArgumentParser()

parser.add_argument("action", action="store", choices=['allon', 'alloff', 'cont'])

args = parser.parse_args()

if args.action == 'allon':
    print 'allon'
elif args.action == 'alloff':
    print 'alloff'

使用示例:

$ python req_argparse.py allon
allon
$ python req_argparse.py alloff
alloff
$ python req_argparse.py nope
usage: req_argparse.py [-h] {allon,alloff,cont}
req_argparse.py: error: argument action: invalid choice: 'nope' (choose from 'allon', 'alloff', 'cont')

答案 3 :(得分:0)

argparse中的选项是可选标记时,它们应该以{{1​​}}开头,如下所示:

--

如果我们再添加代码:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--allon", action='store_true', default = False,
                    help="Toggles all output pins to ON.")
parser.add_argument("--alloff",action='store_true',
                    help="Toggles all output pins to OFF.")
parser.add_argument("--cont", action='store_true',
                    help="Toggles all output pins continously on and off.")
args = parser.parse_args()

我们可以证明您的程序将具有所需的行为:

print args.allon, args.alloff, args.cont

ETA:如果你想要一个等同于git的$ python test.py False False False $ python test.py --allon True False False $ python test.py --alloff False True False $ python test.py --cont False False True $ python test.py --allon --alloff --cont True True True statusadd等的子命令,那么可选的标志将不是实现它的正确方法。您应该使用argparse's add_subparsers functionality