optparse是专门用来在命令行添加选项的一个模块。小程序
首先来看一段示例代码app
from optparse import OptionParser函数 MSG_USAGE = "myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]"oop optParser = OptionParser(MSG_USAGE)学习 optParser.add_option("-f","--file",action = "store",type="string",dest = "fileName")ui ooptParser.add_option("-v","--vison", action="store_false", dest="verbose",default='gggggg',this help="make lots of noise [default]")spa fakeArgs = ['-f','file.txt','-v','good luck to you', 'arg2', 'arge']命令行 options, args = optParser.parse_args(fakeArgs)设计 print options.fileName print options.verbose print options print args print optParser.print_help() |
输入结果为
file.txt False {'verbose': False, 'fileName': 'file.txt'} ['good luck to you', 'arg2', 'arge'] Usage: myprog[ -f <filename>][-s <xyz>] arg1[,arg2..] Options: -h, --help show this help message and exit -f FILENAME, --file=FILENAME -v, --vison make lots of noise [default] |
基本使用步骤
1、 构造一个OptionParser的对象optParse,传入的值MSG_USAGE可被调用打印命令时显示出来。
MSG_USAGE = "myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]" optParser = OptionParser(MSG_USAGE) |
二、 调用OptionParser.add_option()添加选项
optParser.add_option("-f","--file",action = "store",type = "string",dest = "fileName") optParser.add_option("-v","--vison", action="store_false", dest="verbose",default='gggggg', help="make lots of noise [default]") |
add_option()参数说明:
action:存储方式,分为三种store、store_false、store_true
type:类型
dest:存储的变量
default:默认值
help:帮助信息
三、 调用OptionParser.parse_args()剖析并返回一个directory和一个list。
fakeArgs = ['-f','file.txt','-v','good luck to you', 'arg2', 'arge'] options, args = optParser.parse_args(fakeArgs) print options.fileName print options.verbose print options print args |
输出结果
file.txt False {'verbose': False, 'fileName': 'file.txt'} ['good luck to you', 'arg2', 'arge'] |
parse_args()说明:
若是没有传入参加,parse_args会默认将sys.argv[1:]的值做为默认参数。这里咱们将 fakeArgs模拟输入的值。
从返回结果中能够看到,
l options为是一个directory,它的内容fakeArgs为“参数/值 ”的键值对。
l args 是一个list,它的内容是fakeargs除去options后,剩余的输入内容。
l options.version和options.fileName都取到与options中的directory的值。
四、 调用OptionParser.optParser.print_help()输出帮助信息
optParser.print_help() |
显示返回结果
Usage: myprog[ -f <filename>][-s <xyz>] arg1[,arg2..] Options: -h, --help show this help message and exit -f FILENAME, --file=FILENAME -v, --vison make lots of noise [default] |
optParser.print_help()说明:
一、最开始的的MSG_USAGE的值:在这个地方显示出来了。
二、自动添加了-h这个参数。
三、当 optparse 解析到 -h 或者 –help 命令行参数时,会调用 parser.print_help() 打印程序的帮助信息, 打印出帮助信息后,optparse 将会退出,再也不解析其它的命令行参数。
注:在MSG_USAGE中若是使用%prog,会被自动解析为sys.args[0] 也就是文件名。如将,MSG_USAGE = "%prog [options] arg1 arg2",假如文件名为 filexx,那么出如今help中的
信息就是" filexx[options] arg1 arg2"。
add_option()中参数的意义:
short option string: 为第一个参数,表示option的缩写,例如-f;
long option string: 为第二个参数,表示option的全拼,例如--file;
后面的参数皆为命名参数,命名参数为可选参数;
action=: 表示对此option的处理方式,默认值为store,表示存储option的值到解析后的options对象的成员中。action还能够有其余的值:对于bool值,使用store_true来默认存储true,使用store_false来默认存储false,store_const用来存储const设置的值到此option,append表示增长option的参数到list中,此时此option是一个list,可能包含多个值,count表示对counter增长一,callback表示调用指定的函数。全部的action值以下:
store + store_true + store_false + store_const + append + count + callback
type=:表示此option的值的类型,默认为string,能够指定为string,int,choice, float andcomplex;
dest=:表示此option在通过optionparser解析后的options对象中成员的名字,默认使用long option string;
default=:表示比option的默认值;
metavar=:表示显示到help中option的默认值(显示到help的时候并非default);
const=:当action为store_const的时候,须要设置此值;
choices=:当设置type为choices时,须要设置此值;
optparse 是一个可以让程序设计人员轻松设计出简单明了、易于使用、符合标准的 Unix 命令列程序的 Python套件。开始学习 Python 以后,我经常会写一些小程序来处理平常的工做;渐渐地,我发现没法处理参数的程序的弹性有限,因而就开始为个人程序加上解读命令列参数的功能。在发现这个套件以前,我老是以为解读命令列不难,可是要作到像标准 Unix 命令那样完善的使用者互动和错误处置,可就不是一件简单的事了!某天在 Python Library Reference 中发现这个套件,真是如获至宝!今后不用再为解读参数烦恼,能够更专一在解决问题上了!
若是对于 optparse 套件有兴趣,想快速入门的话,能够直接看"基本使用流程"小节,而后再看后面的一些介绍与说明;固然啦!想得到最详细的信息,就只有本身去看 Python Library Reference 啰~
就如下列命令来解释一些术语,myprog 是命令的名字, $ 是命令列提示符号:
1 |
$myprog -f thefile.txt -s xyz a1 a2 a3 |
●argument:
使用者在命令后面所输入的字符串。以本例来讲,"-f", "thefile.txt", "-s", "xyz", "a1", "a2", "a3" 都是 argument。在 Python 中,可使用 sys.argv[1:] 来获得命令列传进来的 argument。为何是 sys.argv[1:] ,而不是 sys.argv呢?由于命令列收到完整的参数还要加上一个命令自己的档名,以本例来讲, sys.argv 应该是:
1 |
["myprog", "-f", "thefile.txt", "-s", "xyz", "a1", "a2", "a3"] |
因此若是要获得去除命令自己的档名之后的参数列,就要靠 sys.argv[1:] 了。
●option:
一些传递给命令的额外 argument,以改变程序的行为。以本例来讲, "-f", "-s" 就是 option。
有几种 option 的写法,在 Unix 系统上的传统写法是 "-" 后跟着一个字母,例如 "-f", "-s";以及 "-f -s", 和 "-fs", 在Unix 系统上均可以被接受。 GNU project 使用另外一种方式,以 "--" 后面跟着一串由 "-" 分开的字符串,例如 "--file-for-log"。Python 的 optparse 套件只接受以上所提的两种 option 格式。
顾名思义, option 应该是无关紧要的,即便命令中没有任何的 option,程序也应该可以正确地执行。若是程序须要使用者输入某些数据才能运做,那么也应该是使用 positional argument 才对。
●option argument:
紧跟随在 option 后的 argument,就是 option argument。以本例来讲, "thefile.txt", "xyz" 都是 option argument。指定 option argument 有两种写法, "-f thefile" 和 "-fthefile", optparse 套件都接受。
option 亦能够没有 option argument,意即 option 单独存在。这样的 option 一般作为旗标 (flag) 用,表明某个功能的开启或是关闭。
●positional argument:
当一个 argument list 被解读完后,剩下的就是 positional argument 了!以本例来讲, "a1", "a2", "a3" 就是 positional argument。一般被用在"使用者必须输入"的信息上。
●required option:
一个有点让人以为矛盾的名词:既然是 "option" (选择),又怎么会是 "required" (必须)的呢? optparse 套件不对这种 option 作出任何的限制或是协助。详情能够参阅 Python Library Reference 6.20.5 的范例程序。
基本使用流程:
》1.产生一个 optparse.OptionParser 的物件。能够在产生时将"程序的命令列说明" (usage) 作为参数,交给OptionParser 的建构子:
1 |
from optparse import OptionParser MSG_USAGE = "myprog[ -f <filename>][ -s <xyz>] arg1[, arg2...]" optParser = OptionParser(MSG_USAGE) |
》2.呼叫 OptionParser.add_option() 加入接受的 option:
1 |
optParser.add_option("-f", "--file", action = "store", type = "string", dest = "fileName") |
参数 action 有许多种类,预设是 "store",因此即便省略也无妨,其它的 action 种类在下面会继续说明。
如有一个以上的 option,重复上述的方式加入(注意:如下省略了 action 参数):
1 |
optParser.add_option("-s", "--someopt", type = "string", dest = "someopt") |
》3.呼叫 OptionParser.parse_args() 进行解读。若是没有传入参数, OptionParser 预设会以 sys.argv[1:] 为对象进行解读。OptionParser.parse_args() 会传回一个 tuple,由 optparse.Values 和 一个 list 所组成。下例传入一个假造的参数列:
1 |
fakeArgs = ['-f', 'thefile.txt', '-s', 'xyz', 'arg1', 'arg2', 'arge']
options, args = optParser.parse_args(fakeArgs)
print options.fileName print options.someopt print args |
最后会获得的输出结果:
1 |
thefile.txt xyz ['arg1', 'arg2', 'arge'] |
这是一个简单的范例,说明了 OptionParser 的通常使用方式。透过这个例子,能够看到若是为程序加入 option, 而且在程序中取得 option argument 和 positional argument。OptionParser.parse_args() 还有许多用法,下面会说明一部份。
为程序加入 flag option:
许多的 Unix 命令拥有 "-v", "-q" 的 option,表明"提供详细讯息"或是"不显示讯息"。要作到这一点,只要在程序中加入下列的 option :
1 |
parser.add_option("-v", action="store_true", dest="verbose") parser.add_option("-q", action="store_false", dest="verbose") opts, args = parser.parse_args() |
第一个 add_option() 加入了一个 "-v" 的 option;若是命令列参数中出现了 "-v",则 opts.verbose 将会是 True;相反的,第二个 add_option() 加入了一个 "-q" option;若是命令列参数中出现了 "-q",则 opts.verbose 将会是 False,这二者并不相悖,程序能够设计成:当收到 "-v" 时,显示详细讯息;当收到 "-q" 时,显示概略讯息,或彻底不显示;当二者都没有收到,则显示通常的讯息。
设定 option 的默认值:
上述的例子都假设命令例会收到预期中的 option,那么若是没有 option 时,接收到的 option 值会是什么呢?答案是 None!若是想为 option 提供默认值,只要在 OptionParser.parse_args()中指定参数 default 就好了:
1 |
parser.add_option("-v", action="store_true", dest="verbose", default = True) parser.add_option("-q", action="store_false", dest="verbose") opts, args = parser.parse_args() |
上述的程序代码为程序加入了两个 option,当 "-v" 没有出现时, opts.verbose 默认值为 True;当 "-q" 被指定时, opts.verbose 被设定为 False,和上一个例子有点不一样。再看下一个例子:
1 |
parser.add_option("-v", action="store_true", dest="verbose", default=False) parser.add_option("-q", action="store_false", dest="verbose", default=True) |
opts.verbose 的默认值会是什么?答案是 True,最后一个指定到同一个目标的 option 默认值会被采用。
通常的 option 亦可加入默认值:
1 |
parser.add_option("-f", action="store", dest="fileName", default = "defaultConfig.txt") |
为程序加入说明:
标准的 Unix 命令大多有着 "-h", "--help" 的 option,会将使用说明印出来。在 OptionParser.parse_args() 中指定"help" 参数,并指定说明的字符串,就能够为这个 option 加入说明了:
1 |
parser.add_option("-v", action="store_true", dest="verbose", default=False, help="make lots of noise [default]") |
当程序收到 "-h" 或 "--help",交给 OptionParser 解读时,会自动印出说明内容,而忽略其它的 argument:
1 |
usage: <yourscript> [options] arg1 arg2
options: -h, --help show this help message and exit -v, --verbose make lots of noise [default] -q, --quiet be vewwy quiet (I'm hunting wabbits) -fFILE, --file=FILE write output to FILE -mMODE, --mode=MODE interaction mode: one of 'novice', 'intermediate' [default], 'expert' |
还记得一开始提到交给 OptionParser 建构子的参数 MSG_USAGE 吗? optparse 套件对 usage 讯息也提供了一些支持。在 usage 中使用 "%prog" 关键词, OptionParser 会自动将其代换为程序名,即 sys.args[0]:
1 |
usage = "usage: %prog [options] arg1 arg2" |
若是程序名为 "myprog",则出如今 help 讯息中的 usage 就会是:
1 |
usage = "usage: myprog [options] arg1 arg2" |
若是OptionParser 建构子没有收到任何参数,则会自动产生一个 usage 讯息:
1 |
"usage: %prog [options]" |
前提是程序没有 positional argument。甭担忧 option 在 help 讯息中排列的方式, OptionParser 会搞定一切,如同前面程序所示。