将 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的主要内容,如果未能解决你的问题,请参考以下文章