我使用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的帮助以使上述代码片段正常工作。
由于 亚历
P.S。 if循环只是教育性的,而不是以这种方式实现。
答案 0 :(得分:6)
当您看到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()
我已将一个函数与每个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
,status
,add
等的子命令,那么可选的标志将不是实现它的正确方法。您应该使用argparse's add_subparsers
functionality。