如何在optparse中未给出选项时返回错误

1 投票
3 回答
1785 浏览
提问于 2025-04-15 21:40

我正在尝试弄清楚如何使用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 个回答

1

parse_args 方法会处理命令行上的所有选项(也就是在脚本名称后面以 - 或 -- 开头的文本,如果某个选项需要值的话,它后面还会跟着一个值)。在所有可能的选项都处理完后,剩下的部分就叫做“位置参数”。这些可以像平常一样通过 sys.argv[1:] 列表来访问。所以,按照你的要求,那些不是“可选”的参数,实际上应该是位置参数,而不是“选项”的一部分,也就是说,它们不应该是这样的形式:

myscript.py --someopt=mandatory

而应该是这样的:

myscript.py --someopt --someotheropt <mandatory arg1> <mandatory arg2>

了解了这些,你就可以在调用 parse_args 之后,轻松地编写正确的逻辑来处理 sys.argv(例如,如果剩下的参数没有两个必需的参数,就抛出一个错误)。

2

我不确定这是否算“错误”,但确实,你在使用选项的方式上有点不太对劲。(我也这样做过,主要是为了快速写脚本)你可以考虑把第一个非选项的参数设定为一个命令词,这样可以明确你的脚本应该执行什么。如果你想让脚本可以执行多个操作,可以接受多个非选项参数。比如,git(或者Subversion,或者其他很多版本控制系统)就是这么做的:

git status

用来检查文件的状态,或者

git stash

用来保存你正在进行的工作的副本,或者

git commit

用来提交更改到仓库。第一个非选项参数就指定了要执行的操作。如果你这样做,就很容易通过检查从parser.parse_args()返回的args的长度来判断是否没有提供命令。

2

程序的必需参数通常是直接给出的,不需要加标志,比如:

munch <filename>

而不是:

munch --name <filename>

这样的做法确保用户明白<filename>是必须提供的,而不是可选的。parse_args会返回一个选项对象和一个剩余参数的列表——那些没有标志的参数。如果这个列表太短了,比如你期待有文件名但却没有,你可以选择抛出一个错误,并且可以利用optparse的功能来显示使用说明。

撰写回答