Python - optparse 之 OptionParser

optparse是專門用來在命令行添加選項的一個模塊。小程序

首先來看一段示例代碼app

from optparse import OptionParser函數

MSG_USAGE = "myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]"oop

optParser = OptionParser(MSG_USAGE)學習

optParser.add_option("-f","--file",action = "store",type="string",dest = "fileName")ui

ooptParser.add_option("-v","--vison", action="store_false", dest="verbose",default='gggggg',this

                     help="make lots of noise [default]")spa

fakeArgs = ['-f','file.txt','-v','good luck to you', 'arg2', 'arge']命令行

options, args = optParser.parse_args(fakeArgs)設計

print options.fileName

print options.verbose

print options

print args

print optParser.print_help()

 

輸入結果爲

file.txt

False

{'verbose': False, 'fileName': 'file.txt'}

['good luck to you', 'arg2', 'arge']

Usage: myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]

Options:

  -h, --help            show this help message and exit

  -f FILENAME, --file=FILENAME

  -v, --vison           make lots of noise [default]

基本使用步驟

1、 構造一個OptionParser的對象optParse,傳入的值MSG_USAGE可被調用打印命令時顯示出來。

MSG_USAGE = "myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]"

optParser = OptionParser(MSG_USAGE)

二、 調用OptionParser.add_option()添加選項

optParser.add_option("-f","--file",action = "store",type = "string",dest = "fileName")

optParser.add_option("-v","--vison", action="store_false", dest="verbose",default='gggggg',

                     help="make lots of noise [default]")

add_option()參數說明:

   action:存儲方式,分爲三種storestore_falsestore_true

   type:類型

   dest:存儲的變量

   default:默認值

   help:幫助信息

三、 調用OptionParser.parse_args()剖析並返回一個directory和一個list

fakeArgs = ['-f','file.txt','-v','good luck to you', 'arg2', 'arge']

options, args = optParser.parse_args(fakeArgs)

print options.fileName

print options.verbose

print options

print args

輸出結果

file.txt

False

{'verbose': False, 'fileName': 'file.txt'}

['good luck to you', 'arg2', 'arge']

parse_args()說明:

   若是沒有傳入參加,parse_args會默認將sys.argv[1:]的值做爲默認參數。這裏咱們將  fakeArgs模擬輸入的值。

從返回結果中能夠看到,

l     options爲是一個directory,它的內容fakeArgs爲「參數/值 」的鍵值對。

l     args 是一個list,它的內容是fakeargs除去options後,剩餘的輸入內容。

l     options.versionoptions.fileName都取到與options中的directory的值。

四、 調用OptionParser.optParser.print_help()輸出幫助信息

optParser.print_help()

   顯示返回結果

Usage: myprog[ -f <filename>][-s <xyz>] arg1[,arg2..]

Options:

  -h, --help            show this help message and exit

  -f FILENAME, --file=FILENAME

  -v, --vison           make lots of noise [default]

optParser.print_help()說明:

一、最開始的的MSG_USAGE的值:在這個地方顯示出來了。

二、自動添加了-h這個參數。

三、當 optparse 解析到 -h 或者 –help 命令行參數時,會調用 parser.print_help() 打印程序的幫助信息, 打印出幫助信息後,optparse 將會退出,再也不解析其它的命令行參數。

 

     注:在MSG_USAGE中若是使用%prog,會被自動解析爲sys.args[0] 也就是文件名。如將,MSG_USAGE = "%prog [options] arg1 arg2",假如文件名爲  filexx,那麼出如今help中的

信息就是" filexx[options] arg1 arg2"

 

add_option()中參數的意義:

short option string: 爲第一個參數,表示option的縮寫,例如-f;

long option string: 爲第二個參數,表示option的全拼,例如--file;

後面的參數皆爲命名參數,命名參數爲可選參數;

action=: 表示對此option的處理方式,默認值爲store,表示存儲option的值到解析後的options對象的成員中。action還能夠有其餘的值:對於bool值,使用store_true來默認存儲true,使用store_false來默認存儲false,store_const用來存儲const設置的值到此option,append表示增長option的參數到list中,此時此option是一個list,可能包含多個值,count表示對counter增長一,callback表示調用指定的函數。全部的action值以下:

store + store_true + store_false + store_const + append + count + callback

type=:表示此option的值的類型,默認爲string,能夠指定爲string,int,choice, float andcomplex;

dest=:表示此option在通過optionparser解析後的options對象中成員的名字,默認使用long option string;

default=:表示比option的默認值;

metavar=:表示顯示到help中option的默認值(顯示到help的時候並非default);

const=:當action爲store_const的時候,須要設置此值;

choices=:當設置type爲choices時,須要設置此值;

optparse 是一個可以讓程序設計人員輕鬆設計出簡單明瞭、易於使用、符合標準的 Unix 命令列程序的 Python套件。開始學習 Python 以後,我經常會寫一些小程序來處理平常的工做;漸漸地,我發現沒法處理參數的程序的彈性有限,因而就開始爲個人程序加上解讀命令列參數的功能。在發現這個套件以前,我老是以爲解讀命令列不難,可是要作到像標準 Unix 命令那樣完善的使用者互動和錯誤處置,可就不是一件簡單的事了!某天在 Python Library Reference 中發現這個套件,真是如獲至寶!今後不用再爲解讀參數煩惱,能夠更專一在解決問題上了

若是對於 optparse 套件有興趣,想快速入門的話,能夠直接看"基本使用流程"小節,而後再看後面的一些介紹與說明;固然啦!想得到最詳細的信息,就只有本身去看 Python Library Reference 

就如下列命令來解釋一些術語,myprog 是命令的名字, $ 是命令列提示符號

1

    $myprog -f thefile.txt -s xyz a1 a2 a3


argument: 
使用者在命令後面所輸入的字符串。以本例來講,"-f", "thefile.txt", "-s", "xyz", "a1", "a2", "a3" 都是 argument。在 Python ,可使用 sys.argv[1:] 來獲得命令列傳進來的 argument。爲何是 sys.argv[1:] ,而不是 sys.argv?由於命令列收到完整的參數還要加上一個命令自己的檔名,以本例來講, sys.argv 應該是

1

    ["myprog", "-f", "thefile.txt", "-s", "xyz", "a1", "a2", "a3"]


因此若是要獲得去除命令自己的檔名之後的參數列,就要靠 sys.argv[1:] 了。 

option: 
一些傳遞給命令的額外 argument,以改變程序的行爲。以本例來講, "-f", "-s" 就是 option 
有幾種 option 的寫法, Unix 系統上的傳統寫法是 "-" 後跟着一個字母,例如 "-f", "-s";以及 "-f -s",  "-fs", Unix 系統上均可以被接受。 GNU project 使用另外一種方式, "--" 後面跟着一串由 "-" 分開的字符串,例如 "--file-for-log"Python  optparse 套件只接受以上所提的兩種 option 格式。 

顧名思義, option 應該是無關緊要的,即便命令中沒有任何的 option,程序也應該可以正確地執行。若是程序須要使用者輸入某些數據才能運做,那麼也應該是使用 positional argument 纔對。 

option argument: 
緊跟隨在 option 後的 argument,就是 option argument。以本例來講, "thefile.txt", "xyz" 都是 option argument。指定 option argument 有兩種寫法, "-f thefile"  "-fthefile", optparse 套件都接受。 

option 亦能夠沒有 option argument,意即 option 單獨存在。這樣的 option 一般作爲旗標 (flag) ,表明某個功能的開啓或是關閉。 

positional argument: 
當一個 argument list 被解讀完後,剩下的就是 positional argument !以本例來講, "a1", "a2", "a3" 就是 positional argument。一般被用在"使用者必須輸入"的信息上。 

required option: 
一個有點讓人以爲矛盾的名詞:既然是 "option" (選擇),又怎麼會是 "required" (必須)的呢? optparse 套件不對這種 option 作出任何的限制或是協助。詳情能夠參閱 Python Library Reference 6.20.5 的範例程序。 

基本使用流程: 

1.產生一個 optparse.OptionParser 的物件。能夠在產生時將"程序的命令列說明" (usage) 作爲參數,交給OptionParser 的建構子

1
2
3

    from optparse import OptionParser

    MSG_USAGE = "myprog[ -f <filename>][ -s <xyz>] arg1[, arg2...]"

    optParser = OptionParser(MSG_USAGE)


2.呼叫 OptionParser.add_option() 加入接受的 option: 

1
2
3
4
5

    optParser.add_option("-f",

                         "--file",

                         action = "store",

                         type = "string",

                         dest = "fileName")


參數 action 有許多種類,預設是 "store",因此即便省略也無妨,其它的 action 種類在下面會繼續說明。 

如有一個以上的 option,重複上述的方式加入(注意:如下省略了 action 參數): 

1
2
3
4

    optParser.add_option("-s",

                         "--someopt",

                         type = "string",

                         dest = "someopt")


3.呼叫 OptionParser.parse_args() 進行解讀。若是沒有傳入參數, OptionParser 預設會以 sys.argv[1:] 爲對象進行解讀。OptionParser.parse_args() 會傳回一個 tuple, optparse.Values  一個 list 所組成。下例傳入一個假造的參數列

1
2
3
4
5
6
7

    fakeArgs = ['-f', 'thefile.txt', '-s', 'xyz', 'arg1', 'arg2', 'arge']

   

    options, args = optParser.parse_args(fakeArgs)

   

    print options.fileName

    print options.someopt

    print args


最後會獲得的輸出結果

1
2
3

    thefile.txt

    xyz

    ['arg1', 'arg2', 'arge']


這是一個簡單的範例,說明了 OptionParser 的通常使用方式。透過這個例子,能夠看到若是爲程序加入 option, 而且在程序中取得 option argument  positional argumentOptionParser.parse_args() 還有許多用法,下面會說明一部份。 

爲程序加入 flag option: 

許多的 Unix 命令擁有 "-v", "-q"  option,表明"提供詳細訊息"或是"不顯示訊息"。要作到這一點,只要在程序中加入下列的 option : 

1
2
3

    parser.add_option("-v", action="store_true", dest="verbose")

    parser.add_option("-q", action="store_false", dest="verbose")

    opts, args = parser.parse_args()


第一個 add_option() 加入了一個 "-v"  option;若是命令列參數中出現了 "-v", opts.verbose 將會是 True;相反的,第二個 add_option() 加入了一個 "-q" option;若是命令列參數中出現了 "-q", opts.verbose 將會是 False,這二者並不相悖,程序能夠設計成:當收到 "-v" ,顯示詳細訊息;當收到 "-q" ,顯示概略訊息,或徹底不顯示;當二者都沒有收到,則顯示通常的訊息。 

設定 option 的默認值: 

上述的例子都假設命令例會收到預期中的 option,那麼若是沒有 option ,接收到的 option 值會是什麼呢?答案是 None!若是想爲 option 提供默認值,只要在 OptionParser.parse_args()中指定參數 default 就好了

1
2
3

    parser.add_option("-v", action="store_true", dest="verbose", default = True)

    parser.add_option("-q", action="store_false", dest="verbose")

    opts, args = parser.parse_args()


上述的程序代碼爲程序加入了兩個 option, "-v" 沒有出現時, opts.verbose 默認值爲 True; "-q" 被指定時, opts.verbose 被設定爲 False,和上一個例子有點不一樣。再看下一個例子

1
2

parser.add_option("-v", action="store_true", dest="verbose", default=False)

parser.add_option("-q", action="store_false", dest="verbose", default=True)


opts.verbose 的默認值會是什麼?答案是 True,最後一個指定到同一個目標的 option 默認值會被採用。 

通常的 option 亦可加入默認值

1

    parser.add_option("-f", action="store", dest="fileName", default = "defaultConfig.txt")


爲程序加入說明: 

標準的 Unix 命令大多有着 "-h", "--help"  option,會將使用說明印出來。在 OptionParser.parse_args() 中指定"help" 參數,並指定說明的字符串,就能夠爲這個 option 加入說明了

1
2
3
4
5

    parser.add_option("-v",

                      action="store_true",

                      dest="verbose",

                      default=False,

                      help="make lots of noise [default]")


當程序收到 "-h"  "--help",交給 OptionParser 解讀時,會自動印出說明內容,而忽略其它的 argument: 

1
2
3
4
5
6
7
8
9

    usage: <yourscript> [options] arg1 arg2

 

    options:

      -h, --help           show this help message and exit

      -v, --verbose        make lots of noise [default]

      -q, --quiet          be vewwy quiet (I'm hunting wabbits)

      -fFILE, --file=FILE  write output to FILE

      -mMODE, --mode=MODE  interaction mode: one of 'novice', 'intermediate'

                           [default], 'expert'


還記得一開始提到交給 OptionParser 建構子的參數 MSG_USAGE ? optparse 套件對 usage 訊息也提供了一些支持。在 usage 中使用 "%prog" 關鍵詞, OptionParser 會自動將其代換爲程序名, sys.args[0]: 

1

    usage = "usage: %prog [options] arg1 arg2"


若是程序名爲 "myprog",則出如今 help 訊息中的 usage 就會是

1

    usage = "usage: myprog [options] arg1 arg2"


若是OptionParser 建構子沒有收到任何參數,則會自動產生一個 usage 訊息

1

    "usage: %prog [options]"


前提是程序沒有 positional argument。甭擔憂 option  help 訊息中排列的方式, OptionParser 會搞定一切,如同前面程序所示。

相關文章
相關標籤/搜索