我在使用 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, alloff
和 cont
被设置为 False
,而在调用时python code.py alloff
我希望
allon
和 cont
为 False
而 alloff
设置为 True
。其次,当我打电话时,例如
python code.py allon
我得到code.py: error: unrecognized arguments: allon
我根本不明白。我知道如何使用 optparse,但非常感谢 argparse 的帮助,以使上述代码段正常工作。
谢谢
亚历克斯
附言if 循环只是教育性的,实际上并没有以这种方式实现。
最佳答案
当您看到像 git status
、 git 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/