在python中使用optparse解析非GNU标准选项

时间:2013-04-03 22:15:12

标签: python arguments command-line-arguments optparse

出于某种原因,我的程序有非标准的命令行选项。我的程序还有一个长的选项,只有一个' - '。例如,有效的命令行选项为'-f'/' - foo'。 short和long选项都需要用空格或'='分隔参数。

我试图使用optparse解析它,但我知道optparse不支持非GNU标准选项。有没有办法调整optparse来做到这一点?

3 个答案:

答案 0 :(得分:2)

这是一种轻度的hackish方式来做你需要的。

子类OptionOptionParser并修补一些方法:

from optparse import Option, OptionError, OptionParser

class MyOption(Option):
    def _set_opt_strings(self, opts):
        for opt in opts:
            if len(opt) < 2:
                raise OptionError(
                    "invalid option string %r: "
                    "must be at least two characters long" % opt, self)
            elif len(opt) == 2:
                self._short_opts.append(opt)
            else:
                self._long_opts.append(opt)

class MyOptionParser(OptionParser):
    def _process_args(self, largs, rargs, values):
        while rargs:
            arg = rargs[0]
            if arg == "--":
                del rargs[0]
                return
            elif arg[0:2] == "--":
                self._process_long_opt(rargs, values)
            elif arg[:1] == "-" and len(arg) > 1:
                if len(arg) > 2:
                    self._process_long_opt(rargs, values)
                else:
                    self._process_short_opts(rargs, values)
            elif self.allow_interspersed_args:
                largs.append(arg)
                del rargs[0]
            else:
                return 

现在你可以做到

parser = MyOptionParser()
parser.add_option(MyOption("-f", "-file", dest="filename",
                 help="write report to FILE", metavar="FILE"))
parser.add_option(MyOption("-q", "-quiet",
                 action="store_false", dest="verbose", default=True,
                 help="don't print status messages to stdout"))

有了这个,parser会接受-file作为选项(并且不接受例如-fq)。

答案 1 :(得分:1)

来自optparse documentation

  

选项:
  用于提供额外信息以指导或定制程序执行的参数。选项有许多不同的语法;传统的Unix语法是一个连字符(“ - ”)后跟一个字母,例如-x-F。此外,传统的Unix语法允许将多个选项合并为单个参数,例如, -x -F相当于-xF。 GNU项目引入了--后跟一系列连字符分隔的单词,例如--file--dry-run这是optparse 提供的唯一两种选项语法。

(强调补充)

所以不,你不能用optparse指定处理参数的其他方法。但是,您可以使用sys module中的argv自行解析参数。

这将是更多的工作,但它可能看起来像:

from sys import argv
for arg in argv:
    if arg.startswith("-") or arg.startswith("--"):
        # Parse the argument

答案 2 :(得分:0)

我认为没有办法调整optparse(虽然我不确定),但getopt是您处理C风格命令行选项的替代选择。