【问题标题】:Why doesn't argparse let me add optional arguments in any order?为什么 argparse 不允许我以任何顺序添加可选参数?
【发布时间】:2018-05-04 08:19:02
【问题描述】:

在下面的代码中,我无法在操作(更新、黑名单、自动)之后添加 -v 和 -p 参数,可能是由于子解析器。我怎样才能做到以任何顺序添加这些可选参数?

parser = argparse.ArgumentParser(usage='pyfilter.py <file> <action> <options>')
parser.add_argument('file', help='blacklist file containing IPs', type=str)

subparsers = parser.add_subparsers(help='help', dest='action')

parser_update = subparsers.add_parser('update', help='update help')

parser_blacklist = subparsers.add_parser('blacklist', help='blacklist help')

parser_auto = subparsers.add_parser('auto', help='auto help')
parser_auto.add_argument('-i', '--interval', help='interval help')

parser.add_argument('-p', '--port', help='specify the port to block', type=int)
parser.add_argument('-v', '--verbose', help='write output to screen', nargs='?')
args = parser.parse_args()

根据解析器,这是有效的:

python3.5 testfilter.py /etc/blacklist.lst -p 22 -v yes update 

而这会为“更新”之后的每个参数产生错误:

python3.5 testfilter.py /etc/blacklist.lst update -p 22 -v yes

【问题讨论】:

  • 你看到了什么错误/
  • @AK47 错误:无法识别的参数:-v yes -p 22
  • 我认为问题在于您需要将所有参数传递给您的parser,然后再向下移动到subparsers,否则,知道您指的是哪个解析器意味着什么?
  • 如果您将选项放在update 之后,您的意思是它们应该是update 的选项,而不是主解析器的选项。
  • @Chase,“喜欢 bash”? Bash 无法控制它调用的程序的行为方式,并且由于 GNU 工具允许您将选项放在位置参数之后,这样做是 active violation of POSIX utility syntax guidelines - 请参阅 #9。

标签: python argparse


【解决方案1】:

这就是你的解析器树的样子

parser
  |__ update
  |     |__ updateOpts
  |__ blacklist
  |__ auto
  |__ port
  |__ verbose

所以如果你更新了,它会沿着 updateOpts 向下遍历,并且在那里找不到端口或详细信息

【讨论】:

    【解决方案2】:

    主解析器识别file(必需)、--port--verbose,以及子解析器选项{'update','auto'}

    一旦遇到子解析器参数,它就会将解析委托给该解析器。子解析器完成后,主解析器不会恢复解析。它报告子解析器无法处理的字符串无法识别。

    因此,用于主解析器的所有字符串都必须在调用子解析器之前出现。

    您可以使用parse_known_args 来解决这个问题。然后无法识别的 args 将在 extras 列表中返回,这可以通过另一个解析步骤来处理。

    Add top level argparse arguments after subparser args

    How do you get argparse to choose a default subparser?

    作为一项规则,argparse 尝试以任何顺序允许可选(标记)参数。当有变量 narg 位置时,有一些限制,在这种情况下,有子解析器。一旦您对代码的组织方式有所了解,这种行为就很有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多