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

标签 python arguments command-line-arguments optparse

由于某种原因,我的程序有非标准命令行选项。我的程序接受一个长选项,也带有一个“-”。例如,有效的命令行选项是“-f”/“-foo”。短选项和长选项都需要有一个用空格或“=”分隔的参数。

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

最佳答案

这是一种稍微有点黑客的方式来完成您需要的事情。

子类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"))

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

关于python - 在 python 中使用 optparse 解析非 GNU 标准选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15799194/

相关文章:

python - 谷歌应用程序引擎(python)导入错误: No module named oauth2 in google app engine

python - 根据子串匹配列

ios - Swift - 调用中参数 "coder"缺少参数

java - 在java中接受日期类型命令行参数

c++ - 通过命令行传递 URL(C++)

windows - 用于比较两个文件列表并删除两个列表中显示的文件的命令行

python - 如何使用 HTTP Basic Auth 注释测试 Flask 路由方法

Python:太长的原始字符串,多行

java - 跨多个类传递参数

parameters - Swift 会自动克隆参数吗?