概览
注:自 version 3.2 起已弃用:该optparse模块已弃用,不会进一步开发;该模块的开发将继续在argparse中进行。
optparse是一个比旧模块getopt更方便、更灵活、更强大的用于解析命令行选项的库。 optpase使用更具声明性的命令行解析样式:创建的实例 ,用选项填充它,然后解析命令行。
允许用户以传统的 GNU/POSIX 语法指定选项,并自动为您生成用法和帮助消息。
如下是是在简单脚本中demo.py使用的示例:
from optparse import OptionParser
...
parser = OptionParser()
parser.add_option("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE")
parser.add_option("-q", "--quiet",
action="store_false", dest="verbose", default=True,
help="don't print status messages to stdout")
(options, args) = parser.parse_args()
通过这几行代码,脚本的用户现在可以在命令行上执行“常规操作”,例如:
python demo.py --file=outfile -q
当调用parse_args()解析命令行时,会将通过方法add_option提供的命令行值设置 option,
返回对象的属性。返回后options.filename就会被设置为
"outfile"
和options.verbose被设置成
False
。 optparse支持长选项和短选项,允许短选项合并在一起,并允许选项以多种方式与其参数相关联。因此,以下命令行都与上面的示例等效:
demo.py -f outfile --quiet demo.py --quiet --file outfile demo.py -q -foutfile demo.py -qfoutfile
此外,用户可以运行以下命令之一
demo.py -h demo.py --help
将optparse打印出脚本选项的简短摘要:
Usage: <yourscript> [options]
Options:
-h, --help show this help message and exit
-f FILE, --file=FILE write report to FILE
-q, --quiet don't print status messages to stdout
其中yourscript的值是在运行时确定的(通常来自 sys.argv[0]
)。
术语:
参数
在命令行中输入的字符串,并由 shell 传递给execl()
或execv()
。在Python中,参数是sys.argv[1:]
的元素(sys.argv[0]表示
正在执行的程序的名称)。
选项
用于提供额外信息来指导或自定义程序执行的参数。
选项有许多不同的语法;传统的 Unix 语法是连字符(“-”)后跟单个字母,例如-x
或-F
。此外,传统的 Unix 语法允许将多个选项合并为一个参数,例如例如-x -F等价于-xF
。GNU 项目引入了后跟一系列连字符分隔的单词,如--file
或--dry-run
。这是optparse项目提供的仅有的两个选项语法。
选项参数
紧跟在选项后面的参数,与该选项密切相关,并且在该选项存在时从参数列表中使用。对于optparse,选项参数可以位于与其选项不同的单独参数中:
-f foo
--file foo
或包含在同一参数中:
-ffoo
--file=foo
通常,给定的选项要么带参数,要么不带参数。
位置参数
解析选项后,即解析选项及其参数并将其从参数列表中删除后,参数列表中剩余的内容。
必选选项
必须在命令行上提供的选项;请注意,“必选选项”在英语中是自相矛盾的。 optparse不会阻止您实现所需的选项。
例如,考虑这个假设的命令行:
prog -v --report report.txt foo bar
-v
和--report
都是选项。假设--report
需要一个参数,report.txt
是一个选项参数。 foo
和 bar
是位置参数。
使用介绍
虽然optparse非常灵活和强大,但在大多数情况下使用起来也很简单。
以下介绍任何基于optparse的程序都通用的代码模式。
第一步,需要导入OptionParser类;然后,在主程序的早期,创建一个 OptionParser 实例:
from optparse import OptionParser
...
parser = OptionParser()
第二步,开始定义选项。基本语法是:
parser.add_option(opt_str, ...,
attr=value, ...)
每个选项都有一个或多个选项字符串opt_str,例如-f
或--file
,以及几个选项属性attr=value,这些属性告诉optparse在命令行上遇到该选项时会发生什么以及要做什么。
通常,每个选项都有一个短选项字符串和一个长选项字符串,例如:
parser.add_option("-f", "--file", ...)
您可以自由定义任意数量的短选项字符串和任意数量的长选项字符串(包括零),只要总体上至少有一个选项字符串即可。
第三步,定义所有选项后,指示optparse解析程序的命令行:
(options, args) = parser.parse_args()
(也可以将自定义参数列表传递给parse_args,但这很少有必要:默认情况下它使用sys.argv[1:]
。)
parse_args()返回两个值:
-
options
,一个包含所有选项值的对象 - 例如,如果--file
采用单个字符串参数,则将options.file
是用户提供的文件名,或者None
如果用户未提供该选项 -
args
,解析选项后剩余的位置参数列表
选项属性
如下将对添加选项时涉及的选项属性进行介绍。
仅涵盖四个最重要的选项属性: action、type、dest (目的地)和help。其中,action是最根本的。
action
action操作告诉optparse在命令行上遇到选项时要做什么。有一组固定的动作被硬编码到optparse;大多数操作都要求optparse将值存储在某个变量中 - 例如,从命令行获取一个字符串并将其存储在options的属性中。
如果不指定选项操作,optparse则默认为store
。
store操作
store是
最常见的选项操作,它告诉我们optparse获取jinj紧接着的下一个参数(或当前参数的其余部分如-n42
),确保它的类型正确,并将其存储到您选择的目的地。
例如:
parser.add_option("-f", "--file",
action="store", type="string", dest="filename")
现在让我们编写一个假命令行并要求optparse解析它:
args = ["-f", "foo.txt"]
(options, args) = parser.parse_args(args)
当optparse看到选项字符串时-f
,它会使用下一个参数foo.txt
并将其存储在options.filename
中。因此在调用 arse_args(args)后,options.filename
是"foo.txt"
。
支持的其他一些选项类型有int
和float
。这是一个需要整数参数的选项:
parser.add_option("-n", type="int", dest="num")
还包括内置complex
型,扩展optparse部分介绍了添加类型。
处理布尔(标志)选项
标记选项(当看到特定选项时将变量设置为 true 或 false)非常常见。 optparse通过两个单独的操作来支持它们, store_true
并且store_false
. 例如,您可能有一个verbose
通过以下命令打开-v
和关闭的标志-q
:
parser.add_option("-v", action="store_true", dest="verbose")
parser.add_option("-q", action="store_false", dest="verbose")
在这里,我们有两个不同的选择,目的地相同,这是完全可以的。(这只是意味着您在设置默认值时必须小心一点 - 见下文。)
当在命令行上 optparse遇到时,它设置为; 当它遇到时, 被设置为。-v
options.verbose
True
-q
options.verbose
False
其他动作
支持的其他一些操作包括:
"store_const"
存储一个恒定值,通过预设
"append"
将此选项的参数附加到列表中
"count"
将计数器加一
"callback"
调用指定函数
type/dest
这个在action的介绍和示例中已经看到。
help
自动生成帮助和使用文本的能力对于创建用户友好的命令行界面非常有用。您所要做的就是help为每个选项提供一个值,并且可以选择为整个程序提供一条简短的使用消息
示例:
usage = "usage: %prog [options] arg1 arg2"
parser = OptionParser(usage=usage)
parser.add_option("-v", "--verbose",
action="store_true", dest="verbose", default=True,
help="make lots of noise [default]")
当使用-h选项时会打印出如下帮助:
Usage: <yourscript> [options] arg1 arg2
Options:
-h, --help show this help message and exit
-v, --verbose make lots of noise [default]
程序示例
#!/usr/bin/env python3
gv_correct_query_ids = ""
gv_src_querydir_streams = ""
TPCDS_DB_STORAGE_FORMAT = ""
def get_option(usage, version):
from optparse import OptionParser
parser = OptionParser(usage=usage, version=version)
parser.add_option("-v", "--verbose", action="store_true"
,dest="verbose", default=True
,help="make lots of noise [default: %default]")
parser.add_option("-u", "--user", help="Database user [default: %default]", default="dbadmin")
parser.add_option("-p", "--password", help="Database user password [default: %default]", default=None)
parser.add_option("-s", "--schema", help="TPCDS schema [default: %default]", default="tpcds")
parser.add_option("-Q", "--querylist", help="TPCDS queries list, this is only used if -m specified to get correct QID from this list [default: %default]"
, default=gv_correct_query_ids)
parser.add_option("-m", "--modify", action='store_true', default=False, help="Modify QID info in all query files")
parser.add_option("-q", "--qids", help="TPCDS query IDs to run from querydir option [default: %default]", default=None)
parser.add_option("-d", "--querydir", help="Directory which store all query files [default: %default]"
, default=gv_src_querydir_streams)
return (options, args)
def main():
""" Main function """
global options, args
options, args = get_option("%prog [Options]", "%prog 1.0")
print(options)
print(args)
print(options.verbose)
print(options.user)
print(options.password)
if __name__ == "__main__":
main()