将 optparse 转换为 argparse

Posted

技术标签:

【中文标题】将 optparse 转换为 argparse【英文标题】:Converting optparse to 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。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于将 optparse 转换为 argparse的主要内容,如果未能解决你的问题,请参考以下文章

如何将 optparse() 代码升级为 argparse() 代码

optparse 到 argparse 的简单包装器?

python中optparse模块用法

Python optparser库详解

optparse参数处理

Python中optparse模块使用浅析