Argparse无法识别,处理不正确

2024-10-04 07:37:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用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。预期的行为如下:调用as时

^{pr2}$

我希望allon, alloff和{}设置为False,而调用为

python code.py alloff

我希望allon和{}为False,而{}设置为True。在

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

code.py: error: unrecognized arguments: allon

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

谢谢 亚历克斯

另外,if循环只是教育性的,实际上并不是这样实现的。在


Tags: store代码addfalsetrueparserargparsehelp
3条回答

选项通常使用前导-表示短参数(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()
....

如果要将函数的第一个参数设为强制参数,并限制可用的选项,请按以下方式执行:

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'

用法示例:

^{pr2}$

当您看到命令模式时,如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()

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

--help的输出:

^{pr2}$

相关问题 更多 >