对于一般的程序参数可使用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个参数那不是很爽?