如何在optparse中未给出选项时返回错误
我正在尝试弄清楚如何使用optparse这个工具,但遇到了一些问题。
我的脚本(用这个简化的例子表示)会处理一个文件,根据传入的选项做不同的事情。如果没有传入任何选项,就什么都不做。
我觉得这样很合理:如果用户没有提供选项,就应该给出一个错误提示。我就是不知道该怎么实现这个功能。
我听说选项应该是可选的,而不是必须的。这是不是意味着我使用选项的方式不对?如果是这样,我应该怎么做呢?我想不出其他的解决办法。
#!/usr/bin/python
from optparse import OptionParser
dict = {'name': foo, 'age': bar}
parser = OptionParser()
parser.add_option("-n", "--name", dest="name")
parser.add_option("-a", "--age", dest="age")
(options, args) = parser.parse_args()
if options.name:
dict['name'] = options.name
if options.age:
dict['age'] = options.age
print dict
#END
3 个回答
parse_args 方法会处理命令行上的所有选项(也就是在脚本名称后面以 - 或 -- 开头的文本,如果某个选项需要值的话,它后面还会跟着一个值)。在所有可能的选项都处理完后,剩下的部分就叫做“位置参数”。这些可以像平常一样通过 sys.argv[1:] 列表来访问。所以,按照你的要求,那些不是“可选”的参数,实际上应该是位置参数,而不是“选项”的一部分,也就是说,它们不应该是这样的形式:
myscript.py --someopt=mandatory
而应该是这样的:
myscript.py --someopt --someotheropt <mandatory arg1> <mandatory arg2>
了解了这些,你就可以在调用 parse_args 之后,轻松地编写正确的逻辑来处理 sys.argv(例如,如果剩下的参数没有两个必需的参数,就抛出一个错误)。
我不确定这是否算“错误”,但确实,你在使用选项的方式上有点不太对劲。(我也这样做过,主要是为了快速写脚本)你可以考虑把第一个非选项的参数设定为一个命令词,这样可以明确你的脚本应该执行什么。如果你想让脚本可以执行多个操作,可以接受多个非选项参数。比如,git(或者Subversion,或者其他很多版本控制系统)就是这么做的:
git status
用来检查文件的状态,或者
git stash
用来保存你正在进行的工作的副本,或者
git commit
用来提交更改到仓库。第一个非选项参数就指定了要执行的操作。如果你这样做,就很容易通过检查从parser.parse_args()
返回的args
的长度来判断是否没有提供命令。
程序的必需参数通常是直接给出的,不需要加标志,比如:
munch <filename>
而不是:
munch --name <filename>
这样的做法确保用户明白<filename>
是必须提供的,而不是可选的。parse_args
会返回一个选项对象和一个剩余参数的列表——那些没有标志的参数。如果这个列表太短了,比如你期待有文件名但却没有,你可以选择抛出一个错误,并且可以利用optparse
的功能来显示使用说明。