Python argparse 忽略未识别的参数

290

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

有没有办法覆盖这个?


24
如果您正在编写一个包装另一个程序的代码,并且希望捕获和修改一些参数,但将其余部分传递下去,那么这会非常方便! - Alan De Smet
2
我为什么最终到了这里,@AlanDeSmet!很高兴我没有尝试做一些疯狂的事情 :) - dwanderson
3个回答

515

替换

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']

31
+1 - 我不知道还有像parse_known_args这样的东西。 - avasal
10
我也没有注意到!我甚至在文档 http://docs.python.org/library/argparse.html?highlight=argparse#partial-parsing 中错过了它。谢谢。 - joedborg
1
在尝试使用parseargs和nosetest时出现了这个问题(它拒绝使用nosetest参数),原因是我在测试中使用了parser.parse_args(None)而不是parser.parse_args([]) - Andy Hayden
3
使用 parse_known_args 而不是 parse_args,可以让你在 if __name__ == 'main': 的代码范围内使用 ArgumentParser,这个条件对于 IPython Notebook 中的所有单元格都是 True,这极大地帮助了我开发和测试代码,并最终将其迁移到从命令行调用的脚本中。 - gumption
1
这似乎无法处理未传递“已知”的可选参数。 - Sharud
显示剩余4条评论

30

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


1
这适用于 parse_args(),不需要 parse_known_args()(在 Python 2.7 上)。 - OozeMeister
4
使用 argparse.REMAINDER 看起来存在长期的 bug,我肯定无法让它正常工作。parse_known_args() 是一个好的替代方案。 - Matt
1
今天遇到了一个长期存在的余数错误:https://bugs.python.org/issue17050 - Scott Carpenter

10
实际上,argparse仍然会“忽略”_unrecognized_args。只要这些“未识别”的参数不使用默认前缀,解析器就不会抱怨。 使用@anutbu的配置,但使用标准parse.parse_args(),如果我们使用以下参数执行程序。
$ program --foo BAR a b +cd e

我们将拥有这个命名空间数据集以便使用。

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

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

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

同样的命令会产生

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

把这个放进你的烟斗里吧 =)

愉悦!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接