Python argparse 忽略无法识别的参数

Posted

技术标签:

【中文标题】Python argparse 忽略无法识别的参数【英文标题】:Python argparse ignore unrecognised arguments 【发布时间】:2012-09-30 20:29:12 【问题描述】:

Optparse,旧版本只是忽略所有无法识别的参数并继续。在大多数情况下,这并不理想,并且在 argparse 中进行了更改。但在某些情况下,您希望忽略任何无法识别的参数并解析您指定的参数。

例如:

parser = argparse.ArgumentParser()
parser.add_argument('--foo', dest="foo")
parser.parse_args()

$python myscript.py --foo 1 --bar 2
error: unrecognized arguments: --bar

有没有办法覆盖这个?

【问题讨论】:

如果您正在为另一个程序编写包装器,并且您想捕获和修改一些参数,但将其余的传递下去,这将非常方便! 正是我来到这里的原因@AlanDeSmet!很高兴我不想做一些疯狂的事情:) 【参考方案1】:

替换

args = parser.parse_args()

args, unknown = parser.parse_known_args()

例如,

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo')
args, unknown = parser.parse_known_args(['--foo', 'BAR', 'spam'])
print(args)
# Namespace(foo='BAR')
print(unknown)
# ['spam']

【讨论】:

+1 - 不知道有类似parse_known_args 我也没有!我什至在文档docs.python.org/library/… 中错过了它。谢谢 在尝试将nosetest 与parseargs 一起使用时出现(它拒绝使用nosetest args),原因是我在测试中使用parser.parse_args(None) 而不是parser.parse_args([])。跨度> FWIW,使用parse_known_args 而不是parse_args 可以在if __name__ == 'main': 范围内的代码中使用ArgumentParser(对于IPython Notebook 中的所有单元格,条件为True ...我发现它极大地帮助了我希望最终迁移到从命令行调用的脚本的开发和测试代码) 这似乎不适用于“已知”未传入的可选参数。【参考方案2】:

如果你想使用剩余的部分,你可以用parser.add_argument('args', nargs=argparse.REMAINDER)将它们放入一个新的参数中。

【讨论】:

这适用于parse_args(),不需要parse_known_args()(在 Python 2.7 上)。 使用 argparse.REMAINDER 似乎充满了长期存在的错误。我当然不能让它工作。 parse_known_args() 是一个不错的选择。 今天刚刚遇到一个长期存在的 REMAINDER 错误:bugs.python.org/issue17050【参考方案3】:

实际上 argparse 仍然“忽略”_unrecognized_args。只要这些“无法识别”的参数不使用默认前缀,您就不会听到解析器的抱怨。

使用@anutbu 的配置,但使用标准parse.parse_args(),如果我们要使用以下参数执行我们的程序。

$ program --foo BAR a b +cd e

我们将使用这个命名空间数据集合。

Namespace(_unrecognized_args=['a', 'b', '+cd', 'e'], foo='BAR')

如果我们希望忽略默认前缀 -,我们可以更改 ArgumentParser 并决定使用 + 来代替我们的“已识别”参数。

parser = argparse.ArgumentParser(prefix_chars='+')
parser.add_argument('+cd')

同样的命令会产生

Namespace(_unrecognized_args=['--foo', 'BAR', 'a', 'b'], cd='e')

把它放进你的烟斗里抽它=)

开心!

【讨论】:

以上是关于Python argparse 忽略无法识别的参数的主要内容,如果未能解决你的问题,请参考以下文章

选择性结构上的python函数argeparse:无法识别的参数

处理 argparse 冲突

Python3 覆盖 argparse 错误

无法识别的字段类未标记为可忽略

“无法识别的类型'员工'。忽略。C:/ .....”从.xml读取输入并将输出写入.xls文件+ perl时出错

org.codehaus.jackson.map.exc.UnrecognizedPropertyException:无法识别的字段“id”(类标准),未标记为可忽略