使用 optparse 或 argparse 处理使用相同选项的多个参数
Using optparse or argparse to process multiple arguments using the same option
我正在尝试编写一个 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']?
我认为最好通过引用参数来完成,即 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
一个有点老套的方法:
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
用于指定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
本身定义的回调。
我正在尝试编写一个 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']?
我认为最好通过引用参数来完成,即 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
一个有点老套的方法:
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
用于指定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
本身定义的回调。