Python 命令行參數和getopt模塊詳解


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM