【问题标题】:Command line options with optional arguments in PythonPython中带有可选参数的命令行选项
【发布时间】:2009-09-22 18:53:11
【问题描述】:

我想知道是否有一种简单的方法来解析 Python 中具有可选参数的命令行选项。例如,我希望能够以两种方式调用脚本:

> script.py --foo
> script.py --foo=bar

从 Python getopt 文档看来,我必须选择其中一个。

【问题讨论】:

    标签: python getopt


    【解决方案1】:

    optparse 来自 stdlib 的模块不支持开箱即用(不应该因为以这种方式使用命令行选项是一种不好的做法)。

    作为@Kevin Horn pointed out,您可以使用argparse 模块(可通过easy_install argparse 安装,或者直接抓取argparse.py 并将其放在sys.path 的任何位置)。

    示例

    #!/usr/bin/env python
    from argparse import ArgumentParser
    
    if __name__ == "__main__":
        parser = ArgumentParser(prog='script.py')
        parser.add_argument('--foo', nargs='?', metavar='bar', default='baz')
    
        parser.print_usage()    
        for args in ([], ['--foo'], ['--foo', 'bar']):
            print "$ %s %s -> foo=%s" % (
                parser.prog, ' '.join(args).ljust(9), parser.parse_args(args).foo)
    

    输出

    用法:script.py [-h] [--foo [bar]] $ script.py -> foo=baz $ script.py --foo -> foo=None $ script.py --foo bar -> foo=bar

    【讨论】:

    • 是否可以使用 argparse 使“script.py --foo -> foo=None”变成“script.py --foo -> foo=baz”?基本上在我的情况下 --foo 与另一个标志 --foo2 互斥,我希望 --foo 的值是可选的,如果它不存在则使用默认值。
    • @Ansis Atteka:据我了解,foofoo2 必须出现在您的情况下,但不能同时出现。这是对的吗?如果是这样,您可以改用命令:script {foo [arg],foo2} 其中arg 如果未设置,则默认为'baz'
    【解决方案2】:

    另外,请注意标准库还有optparse,一个更强大的选项解析器。

    【讨论】:

    • optparse 文档明确声明它不支持带有可选值的参数(有充分的理由)
    【解决方案3】:

    查看 argparse: http://code.google.com/p/argparse/

    尤其是“nargs”选项

    【讨论】:

      【解决方案4】:

      optparse 中没有允许您执行此操作的选项。但是你可以扩展它来做到这一点:

      http://docs.python.org/library/optparse.html#adding-new-actions

      【讨论】:

        【解决方案5】:

        使用optparse 包。

        【讨论】:

        • 查看 Triptych 对 Ned Batchelder 的回答的评论:optparse 文档明确声明它不支持带有可选值的参数
        猜你喜欢
        • 2020-05-04
        • 2012-03-08
        • 2015-07-05
        • 2012-10-26
        • 2014-12-03
        • 2020-01-11
        • 2012-10-06
        • 2017-04-04
        相关资源
        最近更新 更多