我正在使用Python 2.7的argparse包编写一个命令行工具的选项解析逻辑。该工具应接受以下参数之一:
"ON": 打开一个功能。
"OFF": 关闭一个功能。
[未提供参数]: 回显该功能的当前状态。
查看argparse文档后,我认为需要定义两个(可能是三个)子命令,因为这三种状态是互斥的,并表示不同的概念活动。以下是我的当前代码尝试:
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
parser.set_defaults(func=print_state) # I think this line is wrong.
parser_on = subparsers.add_parser('ON')
parser_on.set_defaults(func=set_state, newstate='ON')
parser_off = subparsers.add_parser('OFF')
parser_off.set_defaults(func=set_state, newstate='OFF')
args = parser.parse_args()
if(args.func == set_state):
set_state(args.newstate)
elif(args.func == print_state):
print_state()
else:
args.func() # Catchall in case I add more functions later
我原本以为,如果我提供0个参数,主解析器会设置func=print_state
,如果我提供1个参数,主解析器会使用适当的子命令默认值并调用func=set_state
。 但实际上,当我没有提供参数时,我得到以下错误:
usage: cvsSecure.py [-h] {ON,OFF} ...
cvsSecure.py: error: too few arguments
如果我提供“OFF”或“ON”,则会调用print_state
而不是set_state
。如果我注释掉parser.set_defaults
这行,set_state
将被正确调用。我是一个初级程序员,但对Python还是个新手。您有关如何使其工作的任何建议吗?编辑:我查看子命令的另一个原因是考虑未来可能需要的第四个功能:“FORCE txtval”:将函数的状态设置为
txtval
。
if(len(sys.argv) < 2):
的if/else语句解决了问题!然而,现在它将忽略其余的参数。假设你想要在没有指令的情况下运行脚本,结果为“PRINT”。但是你还想提供--newstate参数。 - Melroy van den Berg