1.使用getopt模塊處理Unix模式的命令行選項:
getopt模塊用於抽出命令行選項和參數,也就是sys.argv。命令行選項使得程序的參數更加靈活。支持短選項模式和長選項模式。
e.g. python scriptname.py -f 'hello' --directory-prefix=/home -t --format 'a' 'b' import getopt shortargs = 'f:t' longargs = ['directory-prefix=', 'format', '--f_long='] opts, args = getopt.getopt( sys.argv[1:], shortargs, longargs )
getopt函數的格式是getopt.getopt ( [命令行參數列表], "短選項", [長選項列表] )
短選項名后的冒號(:)表示該選項必須有附加的參數。
長選項名后的等號(=)表示該選項必須有附加的參數。
返回opts和args。
opts是一個參數選項及其value的元組( ( '-f', 'hello'), ( '-t', '' ), ( '--format', '' ), ( '--directory-prefix', '/home' ) )
args是一個除去有用參數外其他的命令行輸入 ( 'a', 'b' )
然后遍歷opts便可以獲取所有的命令行選項及其對應參數了。
for opt, val in opts: if opt in ( '-f', '--f_long' ): pass if ....
使用字典接受命令行的輸入,然后再傳送字典,可以使得命令行參數的接口更加健壯。
兩個來自python2.5 Documentation的例子:
>>> import getopt >>> args = '-a -b -cfoo -d bar a1 a2'.split() >>> args ['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2'] >>> optlist, args = getopt.getopt(args, 'abc:d:') >>> optlist [('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')] >>> args ['a1', 'a2'] >>> s = '--condition=foo --testing --output-file abc.def -x a1 a2' >>> args = s.split() >>> args ['--condition=foo', '--testing', '--output-file', 'abc.def', '-x', 'a1', 'a2'] >>> optlist, args = getopt.getopt(args, 'x', [ ... 'condition=', 'output-file=', 'testing']) >>> optlist [('--condition', 'foo'), ('--testing', ''), ('--output-file', 'abc.def'), ('-x', '')] >>> args ['a1', 'a2']
python Documentation中也給出了getopt的典型使用方法:
import getopt, sys def main(): try: opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="]) except getopt.GetoptError, err: # print help information and exit: print str(err) # will print something like "option -a not recognized" usage() sys.exit(2) output = None verbose = False for o, a in opts: if o == "-v": verbose = True elif o in ("-h", "--help"): usage() sys.exit() elif o in ("-o", "--output"): output = a else: assert False, "unhandled option" # ... if __name__ == "__main__": main()
下面一段程序演示了在getopt下使用Usage()函數、參數字典(默認參數)、短選項、長選項等。
import os import os.path import sys import getopt def usage(): print ''' py price.py [option][value]... -h or --help -w or --wordattr-file="wordattr文件" -s or --sflog-pricefile="sflog的價格變化文件" -t or --tmpdir="臨時文件的保存目錄,默認為./" -o or --outputfile="完整信息的保存文件,如果不指定,則輸出到stdout" -a or --wordattr-Complement="較新的wordattr去補全信息,缺省為Null,則丟失新廣告的信息" ''' return 0 if ( len( sys.argv ) == 1 ): print '-h or --help for detail' sys.exit(1) shortargs = 'hw:s:t:o:a:' longargs = ['help', 'wordattr=', 'sflog-pricefile=', 'tmpdir=', 'outputfile=', 'wordattr-Complement='] opts, args = getopt.getopt( sys.argv[1:], shortargs, longargs ) if args: print '-h or --help for detail' sys.exit(1) paramdict = {'tmpdir':os.path.abspath(os.curdir), 'outputfile':sys.stdout, 'newwordattr':None } for opt,val in opts: if opt in ( '-h', '--help' ): usage() continue if opt in ( '-w', '--wordattr' ): paramdict['wordattr'] = val continue if opt in ( '-s', '--sflog-pricefile' ): paramdict['pricefile'] = val continue if opt in ( '-t', '--tmpdir' ): paramdict['tmpdir'] = val continue if opt in ( '-o', '--outputfile' ): try: paramdict['outputfile'] = open(val,'w') except Exception,e: #ul_log.write(ul_log.fatal,'%s,%s,@line=%d,@file=%s' \ #%(type(e),str(e),sys._getframe().f_lineno,sys._getframe().f_code.co_filename)) sys.exit(1) continue if opt in ( '-a', '--wordattr-Complement' ): paramdict['newwordattr'] = val continue
2. 使用optparser模塊處理Unix模式的命令行選項:
optparser模塊非常的強大,完全體現了python的“如此簡單,如此強大”的特性。
import optparse def getConfig(ini): import ConfigParser try: cfg = ConfigParser.ConfigParser() cfg.readfp(open(ini)) print cfg.sections() except: pass if __name__=='__main__': parser = optparse.OptionParser() parser.add_option( "-i", "--ini", dest="ini", default="config.ini", help="read config from INI file", metavar="INI" ) parser.add_option( "-f", "--file", dest="filename", help="write report to FILE", metavar="FILE" ) parser.add_option( "-q", "--quiet", dest="verbose", action="store_false", default=True, help="don't print status messages to stdout" ) (options, args) = parser.parse_args() getConfig(options.ini) print args
another usage:
parser = OptionParser(usage='%prog [options] top_dir_name ') parser.disable_interspersed_args() parser.add_option('-t', '--top', dest='topdir', default=".", help='the top directory to search') parser.add_option('-o', '--output', dest='output', default="auto_search_result.txt", help='save the search result to output file') parser.add_option('-d', '--debug', action='store_true', dest='debug', default=False, help='enable debug output') (options, args) = parser.parse_args(sys.argv[1:]) variable options.topdir receive the value of args after -t, so print options.topdir