Python argparse忽略无法识别的参数


206

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

反正有覆盖吗?


14
如果您正在为另一个程序编写包装器,并且想要捕获和修改一些参数,但将其余参数继续使用,则非常方便。
艾伦·德·斯梅特

2
就是为什么我最终在这里@AlanDeSmet!很高兴我没有尝试做疯狂的事情:)
dwanderson

Answers:


351

更换

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

21
+ parse_known_args
1-

7
我也没有!我什至在docs.python.org/library/…中错过了它。谢谢
joedborg 2012年

1
尝试在parseargs中使用鼻子测试时出现了这种情况(拒绝使用鼻子测试args),原因是因为我在做parser.parse_args(None)而不是parser.parse_args([])在测试中。
安迪·海登

3
FWIW使用(parse_known_args而不是parse_args启用)ArgumentParser范围内的in代码if __name__ == 'main':(该条件True适用于IPython Notebook中的所有单元格……我发现这极大地有助于开发和测试代码,最终我希望将其迁移到调用的脚本中从命令行)
进取心

1
这似乎不适用于未传入“已知”的可选
arg。– Sharud

21

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


1
这可以使用parse_args(),并且不需要parse_known_args()(在Python 2.7上)。
OozeMeister

4
使用argparse.REMAINDER似乎充满了长期存在的错误。我当然不能使它工作。parse_known_args()是一个很好的选择。
马特(Matt)

1
今天就遇到了一个长期存在的REMAINDER错误:bugs.python.org/issue17050
Scott Carpenter,

7

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

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

$ program --foo BAR a b +cd e

我们将使用此具有命名空间的数据集合。

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

如果我们想-忽略默认前缀,我们可以更改ArgumentParser并决定将+“ a” 用作我们的“可识别”参数。

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

相同的命令将产生

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

把它放到你的烟斗里然后抽烟=)

欢乐!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.