251

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

反正有覆盖这个吗?

4

3 回答 3

441

代替

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']
于 2012-10-10T11:28:09.927 回答
24

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

于 2014-09-22T04:51:18.997 回答
9

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

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

$ 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')

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

开心!

于 2012-11-28T02:19:36.513 回答