[Python] OptionParser [basic] (Python v2.7 已被移除)

Python v2.7 已經移除此功能, 請改用 argparse

另外一個寫程式很常使用的就是手動輸入參數了, python有個很好用的叫做 OptionParser

官方說明 OptionParser: http://docs.python.org/2/library/optparse.html

宣告很容易, 只要記得import OptionParser就好

from optparser import OptionParser
optParser = OptionParser()

再來就是設定, 例如我需要輸入參數"-f", 其type為string, dest為"fp", help為"specitfy file path"

optParser.add_option("-f", 
          type = "string",
          dest = "fp", 
          default = "/home/hh/tmp", 
          help = "specitfy file path [default: /home/hh/tmp]")



要增加選擇條件要用add_option, 第一個位置是設定要讓人輸入的flag; type = "string" 就是指定你要輸入的內容為string

dest = "fp" 就是讓人輸入內容之後, 要存到fp這個變數

default = "/home/hh/tmp" 顧名思義, 就是預設參數, 這個有沒有都可以, 只是如果沒有輸入-f, 那就會用這個預設值取代fp

help = "specify file path" 就是當使用者輸入python yourprogram.py -h的時候, 會顯示的參數詳細資訊

那只輸入這樣是還沒成功的, 還要輸入下面這行

option, args = optParser.parse_args()

這樣你就能夠來測試一下了, 假設檔名為conf.py

[hh@vm ~]# python conf.py -h
Usage: conf.py [options]

Options:
  -h, --help  show this help message and exit
  -f FP       specitfy file path

你會看到剛剛設定的參數也顯示在help指令, 也可以直接呼叫optParser.print_help()來產生此訊息

接下來如果你輸入 -f 但是不給參數會發生

[hh@vm ~]# python conf.py -f
Usage: conf.py [options]

conf.py: error: -f option requires an argument

就會有錯誤訊息顯示 -f 後面要給定 argument (所以如果要用預設值, 連 -f)

好那要如何操控擷取到的argument? 其實都已經設定到 option 裡面了, 所以例如說剛剛有設定 dest = "fp", 那只要存取 option.fp 即可

那進入詳細一點的解釋

1. 首先是type, 其實python支援滿多種類的, 有 "string", "int", "long", "choice", "float" and "complex"

Type ref: http://docs.python.org/2/library/optparse.html#optparse-standard-option-types

2. 再來, 其實add_option都有預設一個參數: action, 預設是store, 也就是說, 上面的範例, 實際上應該是

optParser.add_option("-f", 
          type = "string",
          action = "store", 
          dest = "fp", 
          default = "/home/hh/tmp", 
          help = "specitfy file path [default: /home/hh/tmp]")


他的意思就是, 將輸入的argument儲存起來, 那其實action還有很多不同用途, 下表有部份常用

"store": 也就是預設將argument儲存起來
"store_true": 存true (boolean模式)
"store_false": 存false (boolean模式)
"append": 將argument存成一個list
"count": 作用類似counter, 每出現一次這個flag就會將dest的值加1
"callback": 呼叫callback function

store_true跟store_false是很常使用的方法, 例如做開關之類的動作, 相當方便(verbose之類)

3. 除此之外, 有預設的還有一個顯示usage: usage = "usage: %prog [options] arg1 arg2"

%prog其實就是你現在的檔案名稱, 同等於: os.path.basename(sys.argv[0])

不特別設定的話就會是現行的檔案名稱

4. 其實除了短版flag, 也有長版flag, 作法很簡單, 只要改成下列
optParser.add_option("-f", "--file", 
          type = "string",
          action = "store", 
          dest = "fp", 
          default = "/home/hh/tmp", 
          help = "specitfy file path [default: /home/hh/tmp]")

這樣不管是輸入-f or --file, 都可以使用

ex:
python conf.py --file=/home/hh/tmp2

其實還有更複雜的group option, 改天再補上

留言

這個網誌中的熱門文章

[Linux] Linux下查詢硬體記憶體資訊 Memory Information

[Other] Chrome 重新整理所有開啟頁面

[Python] Simple Socket Server