使用 optparse 或 argparse 处理使用相同选项的多个参数

Posted

技术标签:

【中文标题】使用 optparse 或 argparse 处理使用相同选项的多个参数【英文标题】:Using optparse or argparse to process multiple arguments using the same option 【发布时间】:2018-10-05 10:59:19 【问题描述】:

我正在尝试编写一个 python 脚本,它可以在运行脚本时回显用户键入的任何内容

现在,我的代码是(version_msg 和usage_msg 现在不重要)

from optparse import OptionParser 

version_msg = ""
usage_msg = ""
parser = OptionParser(version=version_msg, usage=usage_msg)
parser.add_option("-e", "--echo", action="append", dest="input_lines", default=[])

但如果我尝试运行脚本 (python options.py -e hello world),它只会回显 ['hello']。我将如何解决这个问题,使其输出 ['hello', 'world']?

【问题讨论】:

请提供显示version_msg和usage_msg值的完整代码 @ShivamSingh 已修复 【参考方案1】:

argparse 中这很容易,带有nargs 参数:

In [245]: parser = argparse.ArgumentParser()
In [246]: parser.add_argument('-e','--echo', nargs='+');
In [247]: parser.parse_args(['-e','hello','world'])
Out[247]: Namespace(echo=['hello', 'world'])

nargs 用于指定 Action 需要多少个字符串。 “+”表示一个或多个。结果收集在一个列表中。它在正则表达式用法上模拟 nargs 值(例如,'?' 和 '*' 也可以)。

In [248]: parser.print_help()
usage: ipython3 [-h] [-e ECHO [ECHO ...]]

optional arguments:
  -h, --help            show this help message and exit
  -e ECHO [ECHO ...], --echo ECHO [ECHO ...]

查看optparse 文档,我看到一个nargs 参数,但它必须是一个数字。对于变量号,我们必须使用callback,如下所述:

https://docs.python.org/2/library/optparse.html#callback-example-6-variable-arguments

使用本节定义的函数:

In [266]: parser = optparse.OptionParser()
In [267]: parser.add_option('-e','--echo', dest='echo', action='callback', callback=vararg_callback);

In [268]: parser.parse_args(['-e','hello','world'])
Out[268]: (<Values at 0x7f0ff208a5c0: 'echo': ['hello', 'world']>, [])

argparse 中,nargs='+' 将值收集到下一个---,但该分配是由主解析例程自顶向下完成的,而不是为option 本身定义的回调。

【讨论】:

【参考方案2】:

一个有点老套的方法:

from optparse import OptionParser

version_msg = ""
usage_msg = ""
parser = OptionParser(version=version_msg, usage=usage_msg)
parser.add_option("-e", "--echo", action="append", dest="input_lines", default=[])

options, arguments = parser.parse_args()

print(options.input_lines + arguments)

然后我跑

python myscript.py -e hello world how are you

输出:

['hello', 'world', 'how', 'are', 'you']

【讨论】:

所以你正在收集hello 作为-e 的参数,以及其他所有内容作为额外的arguments。从argparse 的角度来看,这不是很令人满意。 收集可变数量的参数在optparse 中比在argparse 中涉及更多。【参考方案3】:

我认为这最好通过引用参数来完成,即 hello world 变为 'hello world' 这可确保 -e 选项消耗整个字符串。 如果您确实需要将字符串分解为 ['hello', 'world'] 而不是 ['hello world'] 您可以轻松地在 options.e[0]

上调用 split()
strings = options.e[0].split()

对于更复杂的方法,您可以使用回调,下面为您提供相关示例的链接。

https://docs.python.org/3/library/optparse.html#callback-example-6-variable-arguments

【讨论】:

嗯,这看起来几乎是我想要的,但它只是将 Hello World 存储为列表中的单个元素,而不是 2 个不同的元素

以上是关于使用 optparse 或 argparse 处理使用相同选项的多个参数的主要内容,如果未能解决你的问题,请参考以下文章

optparse 到 argparse 的简单包装器?

将 optparse 转换为 argparse

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

argparse - 命令行选项与参数解析

『Argparse』命令行解析

『Argparse』命令行解析