Python 使用optparse或argparse使用同一选项处理多个参数

Python 使用optparse或argparse使用同一选项处理多个参数,python,argparse,optparse,Python,Argparse,Optparse,我正在尝试编写一个python脚本,它可以在运行脚本时响应用户键入的任何内容 现在,我的代码是(现在版本和用法无关紧要) 但是如果我尝试运行脚本(python options.py-e hello world),它只会发出['hello']的回声。我该如何解决这个问题,使它输出['hello','world']?我认为最好通过引用参数ie hello world变为'hello world'来实现这一点。这确保了-e选项消耗整个字符串。 如果您真的需要将字符串拆分为碎片,即['hello','w

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

现在,我的代码是(现在版本和用法无关紧要)


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

我认为最好通过引用参数ie hello world变为'hello world'来实现这一点。这确保了-e选项消耗整个字符串。 如果您真的需要将字符串拆分为碎片,即['hello','world']而不是['hello world'],您可以很容易地在options.e[0]上调用split()

strings = options.e[0].split()
对于更复杂的方法,您可以使用回调,下面是相关示例的链接


一种略显老套的方法:

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

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
用于指定操作需要多少字符串。“+”指一个或多个。结果收集在一个列表中。它对正则表达式用法上的
nargs
值进行建模(例如,“?”和“*”也起作用)


查看
optparse
文档,我看到一个
nargs
参数,但它必须是一个数字。对于可变数字,我们必须使用
回调
,如中所述:

使用本节中定义的函数:

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']}>, [])
[266]中的
:parser=optparse.OptionParser()
[267]中的parser.add_选项('-e','-echo',dest='echo',action='callback',callback=vararg_callback);
[268]中的parser.parse_args(['-e','hello','world'])
Out[268]:(,[])

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

请提供显示版本值和用法的完整代码_msg@ShivamSingh修正了,嗯,看起来几乎是我想要的,但是它只是将Hello World存储为列表中的单个元素,而不是两个不同的元素。因此,您将收集
Hello
作为
-e
的参数,并将其他所有内容作为额外的
参数
。从
argparse
的角度来看,这不是很令人满意。
optparse
argparse
更需要收集数量可变的参数。
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 ...]
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']}>, [])