我正在编写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'])
您可以在此处看到-b
在ls
之前的位置已丢失,-a
已从命令中解析出来,这是不可取的。
我怎么能:
答案 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,当遇到未知参数时停止解析。