【问题标题】:Don't parse options after the last positional argument不要在最后一个位置参数之后解析选项
【发布时间】:2011-09-23 05:50:43
【问题描述】:

我正在为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已经从命令中解析出来,这是不希望的。

我该怎么做:

  • 防止参数在某个点之后被解析?
  • 禁止解析散在的参数?
  • 是否允许将带前缀的参数用作位置参数?

【问题讨论】:

    标签: python argparse


    【解决方案1】:

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

    解决方案很简单:将nargs='+'(或'*')替换为nargs=argparse.REMAINDER。此特殊值未记录在案,但它可以满足您的需求。

    【讨论】:

    • 这似乎已经记录在案了。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 2019-09-22
        • 2019-11-09
        • 2011-10-16
        • 2021-04-29
        • 2014-03-28
        • 1970-01-01
        相关资源
        最近更新 更多