Python嵌套的argparse问题

时间:2018-02-14 12:04:03

标签: python argparse

我试图让这个工作

script.py命令onesubcommand mabyanotherone [something] [--optional stuff]

此电流与script.py命令一起使用-h,它显示命令有一组子命令,etc命令子命令-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抛出命名空间。

我如何解决这个问题或如何以正确的方式解决这个问题?

我只想要带有选项的嵌套命令。

1 个答案:

答案 0 :(得分:0)

问题不在于嵌套。这是基本的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...有一个属性,而值是默认值。

使用Py3可以

In[4]。在Py2中会引发错误,因为需要subparsers(这是Py3版本中的错误)。

如果我为每个dest添加add_subparsers参数(正如文档中所述)我

In [8]: parser.parse_args(['command','subcommand'])
Out[8]: Namespace(amount=5, cmd='command', subcmd='subcommand')

有了这个,就可以引用args.cmdargs.subcmd

文档还说明如何set_defaults可以有选择地定义其他属性,包括具有对象值的属性。

https://docs.python.org/3/library/argparse.html#sub-commands