Argparse无法识别和错误处理

Ale*_*lex 3 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()
....
Run Code Online (Sandbox Code Playgroud)

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

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

python code.py
Run Code Online (Sandbox Code Playgroud)

当我打电话时,我想要allon, alloffcont被设定False

python code.py alloff
Run Code Online (Sandbox Code Playgroud)

我想alloncontFalse同时alloff设置为True.

第二,当我打电话时,python code.py allon我得到了

code.py: error: unrecognized arguments: allon
Run Code Online (Sandbox Code Playgroud)

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

谢谢Alex

PS if循环只是教育,而不是实际实现.

Mar*_*ers 6

当你看到像git status,git commit等等的命令模式时,我们正在谈论子命令.要创建子命令,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()
Run Code Online (Sandbox Code Playgroud)

我已经将一个函数与每个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
Run Code Online (Sandbox Code Playgroud)