【问题标题】:Python nested argparse issuesPython嵌套的argparse问题
【发布时间】:2018-07-25 00:06:15
【问题描述】:

我正在努力让它工作

script.py command 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 抛出命名空间。

我该如何解决或如何以正确的方式做到这一点?

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

【问题讨论】:

  • 您的错误显示为elif args.parser_command:,但您的示例代码中没有elif。请确保您发布的代码和错误同时出现。
  • 已编辑以匹配错误。只是写下来时不匹配。 (无法复制粘贴)
  • 您的选项被命名为commandsubcommand 而不是parser_commandparser_subcommand(并且elif 代码是无效的python)。
  • 更改为 if args.command,这是输出“AttributeError: 'Namespace' object has no attribute 'command”。 elif 无效 python 怎么办?
  • 缩进,以及该缩进处缺少其他相关代码。

标签: python argparse


【解决方案1】:

问题不在于嵌套。它具有基本的subparsers 定义。

namespaceargs对象由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.cmdargs.subcmd

文档还展示了如何使用set_defaults 选择性地定义其他属性,包括具有对象值的属性。

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

【讨论】:

  • 感谢您的解释,我会试试这个。
  • 正确的做法与否,这完美。非常感谢,我已经用了一整天的时间来完成这项工作。
猜你喜欢
  • 2015-05-09
  • 2012-07-30
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 2014-08-24
  • 2017-08-23
  • 2021-11-07
相关资源
最近更新 更多