【问题标题】:Argparse using subcommands/subparsers -- AttributeError: 'Namespace' object has no attribute使用子命令/子解析器的 Argparse -- AttributeError: 'Namespace' object has no attribute
【发布时间】:2020-10-24 05:51:51
【问题描述】:

我需要使用具有以下用法的python脚本:

script.py(命令)(选项)

我的问题是如何为“命令”和“选项”添加参数?

我现在做的是这样的:

parser = argparse.ArgumentParser()
parser._optionals.title = "Options"
parser.add_argument('-help','--help', action="store_true", dest="help", help='help')
subparsers = parser.add_subparsers(help="All available commands", title="Commands")

parser_start = subparsers.add_parser('start', help='Starts the script', add_help=False)
parser_start._optionals.title = "Options"
parser_start.add_argument('--help', action="store_true", dest="help_start")
parser_start.add_argument('-f', type=str, dest="file", help='simulation file to start')

parser_ls = subparsers.add_parser('ls', help='Lists running simulations', add_help=False)
parser_ls._optionals.title = "Options"
parser_ls.add_argument('--help', action="store_true", dest="help_ls")
parser_ls.add_argument('--all', action="store_true", help='Display all simulations')

parser_stop = subparsers.add_parser('stop', help='Stops simulation', add_help=False)
parser_stop._optionals.title = "Options"
parser_stop.add_argument('--help', action="store_true", dest="help_down")
parser_stop.add_argument('--sim-name', type=str, dest="sim_name")

args = parser.parse_args()

如果我尝试访问 args.help_up 我会收到:AttributeError: 'Namespace' object has no attribute 'help_start'

如何将 parser_up、parser_stop 和 parser_ls 传递给 parse_args? 之后我如何访问它们?

目标是拥有自定义帮助消息(我有 atm 这就是我禁用帮助的原因)并像这样运行脚本

script.py start -f (name of file)
script.py stop --sim-name (name of simulation)

编辑:

如果我添加 args2 = parser_start.parse_args(),我可以读取 args2.help_start,但我无法找到任何 start、ls 或 down 参数!

【问题讨论】:

  • 添加print(args) 行以查看命名空间中的确切内容。
  • 您可以使用parser_start.format_help()(或print_help)生成子解析器帮助。

标签: python arguments argparse


【解决方案1】:

我对您的代码做了一些更改;希望它能澄清发生了什么:

import argparse

parser = argparse.ArgumentParser()
parser._optionals.title = "Options"
#parser.add_argument('-help','--help', action="store_true", dest="help", help='help')
# conflicts with original help
subparsers = parser.add_subparsers(help="All available commands", title="Commands",
       dest='cmd')    # NEW

parser_start = subparsers.add_parser('start', help='Starts the script', add_help=False)
parser_start._optionals.title = "Options"
parser_start.add_argument('--help', action="store_true", dest="help_start")
parser_start.add_argument('-f', type=str, dest="file", help='simulation file to start')

parser_ls = subparsers.add_parser('ls', help='Lists running simulations', add_help=False)
parser_ls._optionals.title = "Options"
parser_ls.add_argument('--help', action="store_true", dest="help_ls")
parser_ls.add_argument('--all', action="store_true", help='Display all simulations')

parser_stop = subparsers.add_parser('stop', help='Stops simulation', add_help=False)
parser_stop._optionals.title = "Options"
parser_stop.add_argument('--help', action="store_true", dest="help_down")
parser_stop.add_argument('--sim-name', type=str, dest="sim_name")

args = parser.parse_args()

print(args)      # NEW

和样本运行:

0939:~/mypy$ python3 stack62716530.py 
Namespace(cmd=None)
0939:~/mypy$ python3 stack62716530.py --help
usage: stack62716530.py [-h] {start,ls,stop} ...

Options:
  -h, --help       show this help message and exit

Commands:
  {start,ls,stop}  All available commands
    start          Starts the script
    ls             Lists running simulations
    stop           Stops simulation
0939:~/mypy$ python3 stack62716530.py start
Namespace(cmd='start', file=None, help_start=False)
0939:~/mypy$ python3 stack62716530.py start --help
Namespace(cmd='start', file=None, help_start=True)

如果我添加:

if getattr(args, 'help_start',False):
    parser_start.print_help()

我明白了

0940:~/mypy$ python3 stack62716530.py start --help
Namespace(cmd='start', file=None, help_start=True)
usage: stack62716530.py start [--help] [-f FILE]

Options:
  --help
  -f FILE  simulation file to start

关键是help_start只有在start子解析器被调用时才是一个属性。

在第一次阅读您的代码时,我错过了 dest='help_start' 参数。因此,我不知道您为什么希望在args 中看到这样的属性。

【讨论】:

  • 感谢您的回答,问题是我这样做了,它适用于 help_start,但它没有找到 help_ls 和 help_down。我在尝试运行 script.py ls --help 或 stop --help 时收到 *** AttributeError: 'Namespace' object has no attribute 'help_start' ***。
  • 当然help_start 在你使用'ls' 或'stop' 时不会出现在我的示例运行中也不会出现'help_ls'!这就是我使用getattr 的原因。我让您在尝试使用之前查看 args 命名空间。您需要了解在使用不同的子解析器时设置了哪些属性。
  • 我知道 help_start 不会出现,这是我想要的。也请你自己试试。问题是我不能使用 ls 和 stop --help 参数,因为它告诉我找不到 help_start。对不起,如果我没有正确理解它,但这种行为不是我想要的。我希望当 ls 命令可用时只能使用 ls 参数,并且在调用 start 或 stop 时使用它们的参数。目前它阻止我使用它!最好的问候
猜你喜欢
  • 2021-07-03
  • 2022-12-01
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多