【问题标题】:Python argparse to ignore concatenated args?Python argparse 忽略连接的参数?
【发布时间】:2015-12-01 01:49:31
【问题描述】:

我对 Python 2.7 中的 argparse 有疑问。我试图忽略未使用的参数,因为我有一个批处理文件,该文件将参数传递给多个 Python 脚本,并且不同的脚本需要提取不同的参数。

例如:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-a', action='store_true')

如果我自己指定每个参数,它工作正常:

args, unknown = parser.parse_known_args(['-a',' -b'])
print args
# Namespace(a=True)
print unknown
# [' -b']

但如果我以串联格式指定它们:

args, unknown = parser.parse_known_args(['-ab'])

我明白了:

: error: argument -a: ignored explicit argument 'b'

但是,如果我将这一行添加到上面的代码中:

parser.add_argument('-b', action='store_true')

然后这个工作:

args, unknown = parser.parse_known_args(['-ab'])
print args
# Namespace(a=True, b=True)
print unknown
# []

所以看来我只能将连接格式与已知参数一起使用。我想知道是否有一种方法可以使用连接格式,它可以只提取它知道的参数?我能想到的唯一选择就是在所有 Python 脚本中定义所有参数,但那样似乎会污染 -h 帮助显示?

【问题讨论】:

  • 这就是它的工作原理。如果你看方法:它被称为parse_KNOWN_args()
  • 但是参数 -ab 真的只是两个独立参数 a 和 b 的缩短版本,其中 a 已知而 b 不知道吗?如果我使用 -a -b 那么即使 -b 未知,它也可以工作。我只想选择使用 -ab 选项,因为许多管理员更熟悉这种输入方式。
  • 然后定义参数。

标签: python python-2.7 argparse


【解决方案1】:

我以前没有遇到过这个问题,但我可以想象它为什么会发生。但我必须检查代码以确定细节。

'-ab' 被传递给名为consume_optional 的嵌套函数。这有特殊的代码来识别和吐出这些连接的参数。它识别'-a'。由于它不接受任何参数,因此它假定“b”表示“-b”。如果未定义“-b”,则会发出此错误消息。它不会将其放入extras 列表中。

一个独立的“-b”字符串将被放入extras,但这发生在这个consume_optionals函数的开头。你可能认为'-ab'和'-a -b'是同一个东西,但是解析路径不同,导致的错误不同。

试试help=argparse.SUPPRESS '-b'。这应该会减少帮助显示的“污染”。您可能仍然需要使用自定义的“用法”。

'-ab' 在定义了 `-b' 但没有定义 '-a' 的解析器中仍然可能存在问题。整个字符串将放在“附加”列表中。

【讨论】:

  • 太棒了。我将按照这个作为我的解决方案,我将为所有可能的 args 添加条目,然后将 help=argparse.SUPPRESS 用于不使用它们的脚本。效果很好。
猜你喜欢
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 2018-06-13
  • 1970-01-01
相关资源
最近更新 更多