Python 嵌套的 argparse 问题
Python nested argparse issues
我正在努力让它发挥作用
script.py command onesubcommand mabyanotherone [something] [--optional stuff]
这个 currenlty 与 script.py command -h 一起工作,它表明该命令有一组子命令,而 etc command 子命令 -h 表明它有一组必需的选项和可选的。
parser = argparse.ArgumentParser(description='Some commands :D.')
mainsubparsers = parser.add_subparsers()
###
# Arg (sub)command <sub>
parser_list = mainsubparsers.add_parser('command', help='List different things, see command -h')
subparsers = parser_list.add_subparsers()
# Arg (sub)command > subcommand (amount)
parser_subcommand = subparsers.add_parser('subcommand')
parser_subcommand.add_argument('-a', '--amount', type=int, help='Amount to list', default=5)
###
args = parser.parse_args()
然后我试着让它工作
if __name__ == '__main__':
if args.parser_command:
###
elif args.parser_command.subcommand:
# Do stuff
###
但抛出
py script.py command subcommand
Traceback (most recent call last):
File "script.py", line 178, in <module>
if args.parser_command:
AttributeError: 'Namespace' object has no attribute 'parser_command'
所以我尝试将其添加到解析器部分
def c_command:
print(args)
parser_command = mainsubparsers.add_parser('command', help='List different things,see command -h')
subparsers = parser_command.add_subparsers()
parser_command.set_defaults(func=c_command)
###
args.func(args)
函数被触发,但我不知道如何获取子命令及其参数等args.command 抛出命名空间。
如何解决这个问题或如何以正确的方式执行此操作?
我只想要带选项的嵌套命令。
问题不在于嵌套。它具有基本的 subparsers
定义。
查看namespace
,args
对象由parse_args
创建:
In [4]: parser.parse_args(['command'])
Out[4]: Namespace()
In [5]: parser.parse_args(['command','subcommand'])
Out[5]: Namespace(amount=5)
像这样的命令:mainsubparsers = parser.add_subparsers()
不会保存任何关于命令内容的指示。 Out[5]
因为parser_subcommand.add_argument...
有一个属性,value是默认值
In[4]
在 Py3 中是可能的。在 Py2 中会引发错误,因为需要子解析器(这是 Py3 版本中的错误)。
如果我向每个 add_subparsers
添加一个 dest
参数(如文档中所述),我得到
In [8]: parser.parse_args(['command','subcommand'])
Out[8]: Namespace(amount=5, cmd='command', subcmd='subcommand')
这样就可以参考args.cmd
和args.subcmd
文档还展示了如何使用 set_defaults
有选择地定义其他属性,包括具有对象值的属性。
https://docs.python.org/3/library/argparse.html#sub-commands
我正在努力让它发挥作用
script.py command onesubcommand mabyanotherone [something] [--optional stuff]
这个 currenlty 与 script.py command -h 一起工作,它表明该命令有一组子命令,而 etc command 子命令 -h 表明它有一组必需的选项和可选的。
parser = argparse.ArgumentParser(description='Some commands :D.')
mainsubparsers = parser.add_subparsers()
###
# Arg (sub)command <sub>
parser_list = mainsubparsers.add_parser('command', help='List different things, see command -h')
subparsers = parser_list.add_subparsers()
# Arg (sub)command > subcommand (amount)
parser_subcommand = subparsers.add_parser('subcommand')
parser_subcommand.add_argument('-a', '--amount', type=int, help='Amount to list', default=5)
###
args = parser.parse_args()
然后我试着让它工作
if __name__ == '__main__':
if args.parser_command:
###
elif args.parser_command.subcommand:
# Do stuff
###
但抛出
py script.py command subcommand
Traceback (most recent call last):
File "script.py", line 178, in <module>
if args.parser_command:
AttributeError: 'Namespace' object has no attribute 'parser_command'
所以我尝试将其添加到解析器部分
def c_command:
print(args)
parser_command = mainsubparsers.add_parser('command', help='List different things,see command -h')
subparsers = parser_command.add_subparsers()
parser_command.set_defaults(func=c_command)
###
args.func(args)
函数被触发,但我不知道如何获取子命令及其参数等args.command 抛出命名空间。
如何解决这个问题或如何以正确的方式执行此操作?
我只想要带选项的嵌套命令。
问题不在于嵌套。它具有基本的 subparsers
定义。
查看namespace
,args
对象由parse_args
创建:
In [4]: parser.parse_args(['command'])
Out[4]: Namespace()
In [5]: parser.parse_args(['command','subcommand'])
Out[5]: Namespace(amount=5)
像这样的命令:mainsubparsers = parser.add_subparsers()
不会保存任何关于命令内容的指示。 Out[5]
因为parser_subcommand.add_argument...
有一个属性,value是默认值
In[4]
在 Py3 中是可能的。在 Py2 中会引发错误,因为需要子解析器(这是 Py3 版本中的错误)。
如果我向每个 add_subparsers
添加一个 dest
参数(如文档中所述),我得到
In [8]: parser.parse_args(['command','subcommand'])
Out[8]: Namespace(amount=5, cmd='command', subcmd='subcommand')
这样就可以参考args.cmd
和args.subcmd
文档还展示了如何使用 set_defaults
有选择地定义其他属性,包括具有对象值的属性。
https://docs.python.org/3/library/argparse.html#sub-commands