Python argparse忽略无法识别的参数

jdb*_*org 178 python optparse argparse

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
Run Code Online (Sandbox Code Playgroud)

反正有没有覆盖这个?

unu*_*tbu 306

更换

args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

args, unknown = parser.parse_known_args()
Run Code Online (Sandbox Code Playgroud)

例如,

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']
Run Code Online (Sandbox Code Playgroud)

  • +1 - 不知道有一些像'parse_known_args`这样的东西 (16认同)
  • 我也没有!我甚至在文档http://docs.python.org/library/argparse.html?highlight=argparse#partial-parsing中错过了它.谢谢 (5认同)
  • FWIW,使用`parse_known_args`而不是`parse_args`,可以在`if __name__ =='main':`的范围内的代码中使用`ArgumentParser`:对于IPython Notebook中的所有单元格,该条件为"True". ..我发现它有助于开发和测试代码,我希望最终迁移到从命令行调用的脚本) (3认同)

lic*_*nbo 19

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

  • 使用argparse.REMAINDER似乎充满了长期存在的错误.我当然无法让它发挥作用.parse_known_args()是一个不错的选择. (4认同)

nic*_*kl- 7

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

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

$ program --foo BAR a b +cd e
Run Code Online (Sandbox Code Playgroud)

我们将使用此Namespaced数据集合.

Namespace(_unrecognized_args=['a', 'b', '+cd', 'e'], foo='BAR')
Run Code Online (Sandbox Code Playgroud)

如果我们想默认前缀-忽略我们可以改变ArgumentParser和决定,我们将使用+我们的"认可"参数,而不是.

parser = argparse.ArgumentParser(prefix_chars='+')
parser.add_argument('+cd')
Run Code Online (Sandbox Code Playgroud)

将产生相同的命令

Namespace(_unrecognized_args=['--foo', 'BAR', 'a', 'b'], cd='e')
Run Code Online (Sandbox Code Playgroud)

把它放在管道中吸烟=)

的nJoy!