【问题标题】:Converting optparse to argparse将 optparse 转换为 argparse
【发布时间】:2017-09-02 09:11:24
【问题描述】:

使用 optparse,我目前有:

opts, args = parser.parse_args(sys.argv[1:])

然后输入一个接受 opts 的函数:

func(opts,sys.argv)

我现在正在尝试使用 argparse,但 argparse 的格式不同:

args = parser.parse_args(sys.argv[1:])

这不允许我将 opts 输入到函数中。

我想知道是否有任何方法可以在使用 argparse 的同时保持对函数的选择。

我使用的是 Python 2.7。

【问题讨论】:

    标签: python python-2.7 argparse optparse


    【解决方案1】:

    argparse 文档页面的末尾描述了基本区别。

    opts, args = parser.parse_args(sys.argv[1:])
    
    args = parser.parse_args(sys.argv[1:])
    

    optparse 中,所有标记的参数都被捕获在opts 变量中。其他所有内容都在args 列表中。

    argparse 中,标记(也称为可选)和位置都收集在args 命名空间中

    parse_known_args 给出更接近optparse 的输出:

    args, extras = parser.parse_known_args(sys.argv[1:])
    

    extras 是无法解析的字符串;大致对应optparse返回的第二个变量。

    启动一个交互式 shell,定义几个解析器,并使用不同的参数。当然,还可以打印输出('opts'、'args'、'extras')以查看它们产生了什么。

    如果您还有其他问题,请在问题中包含示例解析器和输出。


    In [3]: aparser=argparse.ArgumentParser()
    In [4]: aparser.add_argument('-f');
    In [5]: aparser.add_argument('bar');
    
    In [6]: oparser=optparse.OptionParser()
    In [7]: oparser.add_option('-f')
    

    optparse 解析:

    In [22]: opts, rest = oparser.parse_args('-f one two'.split())
    In [23]: opts
    Out[23]: <Values at 0xaca3a02c: {'f': 'one'}>
    In [24]: rest
    Out[24]: ['two']
    In [25]: opts.f
    Out[25]: 'one'
    

    argparse 解析

    In [26]: args = aparser.parse_args('-f one two'.split())
    In [27]: args
    Out[27]: Namespace(bar='two', f='one')
    In [28]: args.f
    Out[28]: 'one'
    In [29]: args.bar
    Out[29]: 'two'
    

    parse_known_args:

    In [30]: args, extras = aparser.parse_known_args('-f one two three'.split())
    In [31]: args
    Out[31]: Namespace(bar='two', f='one')
    In [32]: extras
    Out[32]: ['three']
    

    【讨论】:

      【解决方案2】:

      您可以以与optparse 非常相似的方式使用argparse。从the documentation 可以看出,您只需在参数前面加上---,它就变成了一个可选参数。

      这是文档中的一个示例:

      parser = argparse.ArgumentParser()
      parser.add_argument('-f', '--foo')
      parser.add_argument('bar')
      args = parser.parse_args
      

      此外,如果您的程序需要具有不同字符前缀的选项,您可以更改prefix chars

      parser = argparse.ArgumentParser(prefix_chars='+')
      parser.add_argument('+f', '++foo')
      parser.add_argument('bar')
      args = parser.parse_args
      

      【讨论】:

        猜你喜欢
        • 2012-04-22
        • 2015-06-02
        • 2011-03-14
        • 2021-09-24
        • 2017-04-01
        • 2015-05-07
        • 2012-09-11
        • 2013-01-01
        • 2021-08-01
        相关资源
        最近更新 更多