使用 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 处理使用相同选项的多个参数的主要内容,如果未能解决你的问题,请参考以下文章