我正在编写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.这个特殊值没有记录,但它可以满足您的需求.