对于一般的程序参数可使用sys.argv,对于复杂的程序参数可以使用optparse
一、简单演示
实例1
#!/usr/bin/env python
import optparse
def main():
p=optparse.OptionParser()
p.add_option('--sysadmin','-s',default='diege')
options,arguments=p.parse_args() #options和赋值给选项的值构成选项字典的key和value,注value和arguments没有关系
print 'Hello,%s' % options
print 'Hello,%s' % options.sysadmin #options.sysadmin 获取到选项对应的参数值
if __name__=='__main__':
main()
#python optparse-example1.py
Hello,{'sysadmin': 'diege'}
Hello,diege
# python optparse-example1.py -s lily
Hello,{'sysadmin': 'lily'} #{选项: 选项的参数【不是程序的参数】}
Hello,lily
二、optparse使用模式
1、非选项使用模式
非选项模式就是没有设置选项options,只有参数arguments
#optparse-example2.py
import os,optparse
def main():
p=optparse.OptionParser(description="Python 'ls' command clone",prog="pyls",version="0.1a",usage="%prog [directory]")
options,arguments=p.parse_args()
if len(arguments)==1:
path=arguments[0]
#print options #options 打印出来是一个空的字典 {} 在options,arguments前没有使用p.add_option
#print arguments #arguments打印出来是一个列表['/usr/local/'] 是传给程序的参数
for filename in os.listdir(path):
print filename
else:
p.print_help() #如果参数少于1或多于1个,调用内建的help信息,介绍如果使用工具
if __name__=="__main__":
main()
# python optparse-example2.py
Usage: pyls [directory]
Python 'ls' command clone
Options:
--version show program's version number and exit
-h, --help show this help message and exit
2、True/False使用模式
p.add_option里的关键参数default=False和action='store_true'
在程序中使用一个选项来设置True/False,经典示例设置"--quit"选项(该参数关闭所有标准输出),和"--verbose"选项(将触发额外输出)
Optparse_example3.py
import optparse,os
def main():
p=optparse.OptionParser(description="Python 'ls' command clone",prog="pyls",version="0.1a",usage="%prog [directory]")
p.add_option("--verbose",'-v',action='store_true',help="Enables Verbose Output",default=False)
p.add_option("--quiet","-q",action='store_true',help="Enables Quiet Output",default=False)
#default=False 默认不启用这个模式,要使用这个模式的给-v/-q,如果设置default=True则默认启用这个模式
#如果两个选项都使用default=True,则在if判断里第一个模式使用。而不是p.add_option的顺序,推荐默认都使用default=False
options,arguments=p.parse_args()
if len(arguments)==1:
print options
if options.verbose:
print "Verbose Mode Enabled"
path=arguments[0]
for filename in os.listdir(path):
if options.verbose:
print "Filename:%s" % filename
elif options.quiet:
pass #这里可以定义安静输出到LOG等操作
else:
print filename
else:
p.print_help()
if __name__=="__main__":
main()
# python Optparse_example3.py
Usage: pyls [directory]
Python 'ls' command clone
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-v, --verbose Enables Verbose Output
-q, --quiet Enables Quiet Output
# python Optparse_example3.py /tmp/
{'verbose': False, 'quiet': False}
# python Optparse_example3.py /tmp/ -v
{'verbose': True, 'quiet': False}
3、记数选项模式
p.add_option里的关键参数action="count",dest="verbose"
如果tcpdump中的-vvv,ps的-ww等
Optparse_example4.py
import optparse,os
def main():
p=optparse.OptionParser(description="Python 'ls' command clone",prog="pyls",version="0.1a",usage="%prog [directory]")
#p.add_option('-v',action="count",dest="verbose") #这里的dest对应options里的key options.verbose调用值
#dest="verbose"和'--verbose'一样,使用dest="verbose"也没有长选项--verbose.可以使用('--verbose','-v',action="count")
p.add_option('--verbose','-v',action="count",help="Enables Verbose Output") #加一个帮助
options,arguments=p.parse_args()
if len(arguments)==1:
#print options
#print arguments
if options.verbose:
print "Verbose Mode Enabled at Level:%s" % options.verbose
path=arguments[0]
for filename in os.listdir(path):
if options.verbose==1:
print "Filename:%s" % filename
elif options.verbose==2:
fullpath=os.path.join(path,filename)
print "Filename:%s |Byte Size:%s" % (filename,os.path.getsize(fullpath))
else:
print filename
else:
p.print_help()
if __name__=="__main__":
main()
# python Optparse_example4.py /tmp/
{'verbose': None}
# python Optparse_example4.py /tmp/ -v
{'verbose': 1}
# python Optparse_example4.py /tmp/ -vv
{'verbose': 2}
4、选择使用模式
p.add_option里的关键参数action="store",type="choice",dest="chatty",choices=["normal","verbose","quiet"],default="normal"
import optparse,os
def main():
p=optparse.OptionParser(description="Python 'ls' command clone",prog="pyls",version="0.1a",usage="%prog [directory]")
p.add_option('--chatty','-c',action="store",type="choice",dest="chatty",choices=["normal","verbose","quiet"],default="normal")
options,arguments=p.parse_args()
print options
if len(arguments)==1:
if options.chatty=="verbose":
print "Verbose Mode Enabled"
path=arguments[0]
for filename in os.listdir(path):
if options.chatty=="verbose":
print "Filename:%s" % filename
elif options.chatty=="quiet":
pass
else:
print filename
else:
p.print_help()
if __name__=="__main__":
main()
ofreebsd# python Optparse_example5.py
{'chatty': 'normal'}
Usage: pyls [directory]
Python 'ls' command clone
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-c CHATTY, --chatty=CHATTY
ofreebsd# python Optparse_example5.py -c /tmp/
Usage: pyls [directory]
pyls: error: option -c: invalid choice: '/tmp/' (choose from 'normal', 'verbose', 'quiet')
# python Optparse_example5.py -c verbose /tmp/
{'chatty': 'verbose'}
Verbose Mode Enabled
# python Optparse_example5.py -c quiet /tmp/
{'chatty': 'quiet'}
也可以使用长格式
# python Optparse_example5.py --chatty=verbose /tmp
{'chatty': 'verbose'}
Verbose Mode Enabled
Filename:.snap
Filename:.X11-unix
5、具有多参数的选项使用模式
默认情况下身optparse选项只能有一个参数。但是可以指定参数的个数也是可以的。实例让ls同时输出三个目录的内容.
p.add_option里的关键参数action="store",nargs=3
Optparse_example6.py
import optparse,os
def main():
p=optparse.OptionParser(description="Python 'ls' command clone",prog="pyls",version="0.1a",usage="%prog [--dir dir1 dir2 dir3]")
p.add_option('--dir','-d',action="store",dest="dir",nargs=3,help="Show more than one dir")#dest和help都是可选的
options,arguments=p.parse_args()
if options.dir:
print options
for dir in options.dir:
print "Listing of %s:\n" % dir
for filename in os.listdir(dir):
print filename
else:
p.print_help()
if __name__=="__main__":
main()
# python Optparse_example6.py -d /tmp /root/
Usage: pyls [--dir dir1 dir2 dir3]
pyls: error: -d option requires 3 arguments
# python Optparse_example6.py -d /tmp /root/ /data/
{'dir': ('/tmp', '/root/', '/data/')}
我们发现在options字典里,传递dir选项的三个参数是一个元组。
注意:这里的三个参数,不是说可以选择输入1,2或者3个参数,而是必须输入三个。如果可以自由选择输入1,2或3个参数那不是很爽?