天天看點

Python中的 optparse子產品

python的内置子產品中對于指令行的解析子產品共兩個getopt 和 optparse 。不過getopt過于簡單,往往不能滿足需求。此時可以使用optparse子產品。這個子產品相對于getopt更新,功能更強大。

那麼如何使用optparse子產品呢? optparse 子產品的官方文檔給出了很詳細的說明。

第一步、導入子產品,并在主函數中建立執行個體

from optparse import OptionParser
[...]
parser = OptionParser()           

複制

第二步、使用add_option定義需要的option

parser.add_option(opt_str, ...,
                  attr=value, ...)           

複制

add_option 方法中有很多可選的參數,及一些影響optparse函數行為的屬性。這些東西都很值得去細細推敲。

最後一步、當定義完所有option 後,通過parse_args 去解析所有的option。并傳回解析結果

(options, args) = parser.parse_args()           

複制

parse_args 預設解析的是sys.argv[1:] 的所有參數。不過若你喜歡,也可以自己傳遞參數到parse_args。例如如下的形式:

args = ["-f", "foo.txt"]
(options, args) = parser.parse_args(args)           

複制

parse_args 有兩個傳回值,options 和 args 。其中options是一個對象,通過這個對象可以擷取到所有定義的option相應資訊。而args是一個list,裡面存儲了所有沒有被定義的參數資訊。

以上三個步驟,就是使用optparse子產品的完整展現。不過在第二步中add_option中存在很多影響pars_args行為的屬性,将在下面逐漸記錄解釋。

action 屬性:

它将告訴optparse 遇到相應的指令行時應該怎麼去做。預設若不指定action屬性,它将被賦予預設值store。那麼store是什麼意義呢?以官方的執行個體說明

當添加如下的option:

parser.add_option("-f", "--file",
                  action="store", type="string", dest="filename")           

複制

且傳遞如下的參數:

args = ["-f", "foo.txt"]
(options, args) = parser.parse_args(args)           

複制

當optparse 發現參數-f 時,它會将-f後面的一個參數也消費掉(将-f 和 foo.txt綁定到一起了)。并将foo.txt存儲到options.filename中。當經過parse_args解析後,調用options.filename時将得到foo.txt這個值。

以上是action的預設值store。另外還有布爾類型的action。這樣類型的東西主要是在指令行參數不需要值的時候使用。例如 -v 檢視版本号, -v 後面就需要再寫參數了。

Example:

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

複制

以上兩個例子,當經過parse_args後調用options.verbose将為true。而調用options.quit将為false

當然,action還有其他一些值。如:store_const、append、count 和 callback 。研究後再呈上文章吧。

default屬性:

給相應的參數設定預設值,也是一個很有必要知道的屬性

Example:

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

複制

另外一種比較清晰的方法設定預設值:

parser.set_defaults(verbose=True)
parser.add_option(...)
(options, args) = parser.parse_args()           

複制

等等吧。具體了解,還需參考相應的官方手冊:https://docs.python.org/2/library/optparse.html