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

Mat*_*ner 15 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()
Run Code Online (Sandbox Code Playgroud)

但是如果选项作为命令的一部分传递(例如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'])
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到-b之前的位置ls已经丢失,并且-a已经从命令中解析出来,这是不可取的.

我怎么能够:

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

Joh*_*nck 17

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

解决方案很简单:替换nargs='+'(或'*')nargs=argparse.REMAINDER.这个特殊值没有记录,但它可以满足您的需求.

  • 现在似乎已记录在案. (8认同)

dco*_*ish 5

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

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