不要在最后一个位置参数后解析选项

时间:2011-06-27 05:00:12

标签: python argparse

我正在编写ssh命令行客户端的包装器。在command的第一个位置参数之后,所有其他选项也应被视为位置参数。

optparse下,我相信这可以通过disable_interspersed_args完成。

目前我有这样的事情:

parser = argparse.ArgumentParser()
parser.add_argument('--parallel', default=False, action='store_true')
# maybe allow no command? this would ssh interactively into each machine...
parser.add_argument('command', nargs='+')
args = parser.parse_args()

但是如果选项作为命令的一部分传递(例如my_wrapper ls -l),则它们会被ArgumentParser解释为未知选项。 error: unrecognized arguments: -l

如果我使用parse_known_args(),则可能会使选项无序。

p = argparse.ArgumentParser()
p.add_argument('-a', action='store_true')
p.add_argument('command', nargs='+')
print(p.parse_known_args())

$ python3 bah.py -b ls -l -a
(Namespace(a=True, command=['ls']), ['-b', '-l'])

您可以在此处看到-bls之前的位置已丢失,-a已从命令中解析出来,这是不可取的。

我怎么能:

  • 防止在某个点之后解析参数?
  • 禁用散布参数的解析?
  • 允许带有前缀的参数作为位置参数使用吗?

3 个答案:

答案 0 :(得分:17)

我遇到了同样的问题。我在argparse bug跟踪器上找到了解决方案:http://code.google.com/p/argparse/issues/detail?id=52

解决方案很简单:将nargs='+'(或'*')替换为nargs=argparse.REMAINDER。这个特殊值没有记录,但它可以做你想要的。

答案 1 :(得分:3)

我认为开始解决这些问题的最佳方法是在所有可选参数之后尝试----是一个伪arg,告诉ArgumentParser后面的所有内容都是位置参数。文档为here

至于防止参数在某个点之后被解析,你可以将部分argv传递给parse_args。结合一些内省可以用来限制解析的内容。

答案 2 :(得分:-1)

另一种选择是使用parse_known_args,当遇到未知参数时停止解析。