我在使用 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 的帮助,以使上述代码段正常工作。

谢谢
亚历克斯

附言if 循环只是教育性的,实际上并没有以这种方式实现。

最佳答案

当您看到像 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()

我已经将一个函数与每个子解析器 ( 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

关于python - Argparse 无法识别且处理不当,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12507104/

10-13 09:06