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

时间:2018-04-25 04:50:25

标签: python argparse optparse

我试图编写一个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']?

3 个答案:

答案 0 :(得分:2)

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本身。

答案 1 :(得分:1)

这种做法略显苛刻:

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']

答案 2 :(得分:0)

我认为这最好通过引用这个论点来实现,即你好世界变成了“你好世界”。这可以确保-e选项使用整个字符串。 如果你真的需要将字符串分解成碎片,即[&#39;你好&#39;,&#39;世界&#39;]而不是[&#39; hello world&#39;]你可以轻松地调用split ()关于options.e [0]

strings = options.e[0].split()

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

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