1.需求來源
有時候我們需要寫一些腳本處理一些任務,可能根據不同的條件輸入不同的命令,來完成不同的任務。能不能做到跟linux操作系統一樣,看着更高大上一點呢?
答案當然是可以的啦!getopt能滿足你的需求
先看個linux 中的系統命令吧:最終目的就是寫出類似的腳本。
2.getopt介紹
getopt這個函數 就是用來抽取 sys.argv 獲得的用戶輸入來確定執行步驟。
getopt是個模塊,而這個模塊里面又有getopt 函數,所以getopt需要這樣這樣用。
getopt.getopt( [命令行參數列表], "短選項", [長選項列表] )
該函數返回兩個值. opts 和args
opts 是一個存有所有選項及其輸入值的元組.當輸入確定后,這個值不能被修改了.
args 是去除有用的輸入以后剩余的部分.
1 import getopt,sys 2 shortargs = 'f:t' #短選項 3 longargs = ['directory-prefix=', 'format', '--f_long='] #長選項 4 opts,args= getopt.getopt( sys.argv[1:], shortargs, longargs) 5 print 'opts=',opts 6 print 'args=',args
getopt函數的格式是getopt.getopt ( [命令行參數列表], "短選項", [長選項列表] ) 短選項名后的冒號(:)表示該選項必須有附加的參數。 長選項名后的等號(=)表示該選項必須有附加的參數。
幾種輸出結果為:
分清longargs長選項里面的數據,是什么樣的必須在前面追加--,不然出異常。例如
正確格式:----f_long='data'
錯誤格式:--f_long='data'
正確:
錯誤:
不同的數據參數格式,被捕獲的結果不一樣:當格式正確的時候被opts捕獲,當不是參數格式的時候被args捕獲。
選項的寫法要求
對於短格式,"-"號后面要緊跟一個選項字母。如果還有此選項的附加參數,可以用空格分開,也可以不分開。長度任意,可以用引號。如以下是正確的:
-o
-oa
-obbbb
-o bbbb
-o "a b"
對於長格式,"--"號后面要跟一個單詞。如果還有些選項的附加參數,后面要緊跟"=",再加上參數。"="號前后不能有空格。如以下是正確的:
--help=file1
而這些是不正確的:
-- help=file1
--help =file1
--help = file1
--help= file1
3.如何使用getopt進行分析
使用getopt模塊分析命令行參數大體上分為三個步驟:
1.導入getopt,sys模塊。
2.分析命令行參數。
3.處理結果。
第一步:導入模塊
import sys,getopt
第二步:處理方法如下
try: opts, args = getopt.getopt(sys.argv[1:], "ho:", ["help", "output="]) except getopt.GetoptError: # print help information and exit:
解釋如下:
1. 處理所使用的函數叫getopt() ,因為是直接使用import 導入的getopt 模塊,所以要加上限定getopt 才可以。
2. 使用sys.argv[1:] 過濾掉第一個參數(它是執行腳本的名字,不應算作參數的一部分)。
3. 使用短格式分析串"ho:" 。當一個選項只是表示開關狀態時,即后面不帶附加參數時,在分析串中寫入選項字符。當選項后面是帶一個附加參數時,在分析串中寫入選項字符同時后面加一 個":" 號 。所以"ho:" 就表示"h" 是一個開關選項;"o:" 則表示后面應該帶一個參數。
4. 使用長格式分析串列表:["help", "output="] 。長格式串也可以有開關狀態,即后面不跟"=" 號。如果跟一個等號則表示后面還應有一個參數 。這個長格式表示"help" 是一個開關選項;"output=" 則表示后面應該帶一個參數。
5. 調用getopt 函數。函數返回兩個列表:opts 和args 。opts 為分析出的格式信息。args 為不屬於格式信息的剩余的命令行參數。opts 是一個兩元組的列表。每個元素為:( 選項串, 附加參數) 。如果沒有附加參數則為空串'' 。
6. 整個過程使用異常來包含,這樣當分析出錯時,就可以打印出使用信息來通知用戶如何使用這個程序。
如上面解釋的一個命令行例子為:
'-h -o file --help --output=out file1 file2'
在分析完成后,opts 應該是:
[('-h', ''), ('-o', 'file'), ('--help', ''), ('--output', 'out')]
而args 則為:
['file1', 'file2']
第三步:主要是對分析出的參數進行判斷是否存在,然后再進一步處理。主要的處理模式為:
for o, a in opts: if o in ("-h", "--help"): usage() #處理參數 sys.exit() if o in ("-o", "--output"): output = a
使用一個循環,每次從opts 中取出一個兩元組,賦給兩個變量。o 保存選項參數,a 為附加參數。接着對取出的選項參數進行處理。
實例代碼:
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 import getopt,sys 4 5 def usage(): 6 print "Usage:%s [-a|-o|-c] [--help|--output] args...." %(sys.argv[0]) 7 8 if __name__=='__main__': 9 try: 10 shortargs = 'f:t' 11 longargs = ['directory-prefix=', 'format', '--f_long='] 12 opts,args= getopt.getopt( sys.argv[1:], shortargs, longargs) 13 print '****************opts********************' 14 print 'opts=',opts 15 print '****************args********************' 16 print 'args=',args 17 18 for opt,arg in opts: 19 if opt in ('-h','--help'): 20 usage() 21 sys.exit(1) 22 elif opt in ('--f_long'): 23 print '--f_long=',opt 24 else: 25 print '%s====> %s' %(opt,arg) 26 except getopt.GetoptError: 27 print 'getopt error!' 28 usage() 29 sys.exit(1)
運行結果:
[root@muban1228 test]# python test1.py -f 'test' -t --directory-prefix='aaaaaaa' ----f_long='bbbbb' --format
****************opts********************
opts= [('-f', 'test'), ('-t', ''), ('--directory-prefix', 'aaaaaaa'), ('----f_long', 'bbbbb'), ('--format', '')]
****************args********************
args= []
--f_long= -f
-t====>
--directory-prefix====> aaaaaaa
----f_long====> bbbbb
--format====>
expect類提示:
[root@muban1228 test]# python test1.py -f 'test' -h --directory-prefix='aaaaaaa' ----f_long='bbbbb' --format
getopt error!
Usage:test1.py [-a|-o|-c] [--help|--output] args....
參考文檔:http://andylin02.iteye.com/blog/845355