Python命令行選項參數解析策略

概述

在Python的項目開發過程中,我們有時需要爲程序提供一些可以通過命令行進行調用的接口。不過,並不是直接使用 command + 當前文件 就ok的,我們需要對其設置可選的各種各樣的操作類型。所以,這種情況下我們就有必要對傳入的參數進行解析操作。下面就此問題提出幾種不同的解決策略,希望於你有益。


版權說明

著作權歸作者所有。
商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
作者:Q-WHai
發表日期: 2016年3月18日
鏈接:http://blog.csdn.net/lemon_tree12138/article/details/50912898
來源:CSDN
更多內容:分類 >> Thinking In Python


目錄

樸素字符串匹配方案

分析

其實此方法可以很直接地表達程序猿們在邏輯這條路走了多遠。當然,這並沒有包含任何的不敬。
這的確是一種方案,甚至可以說是一種算法。因爲其直截了當,所以在程序開發初期,本人也是如此樂此不疲。除了完全的一個一個的命令之外,我們還可以對參數進行json封裝,這樣就更加體貼了。
關於,這一點我想也不用多說什麼的了。還是留一些時間給後面的兩種解決方案比較妥當。不過還是可以說說此方案的優點與缺點。

優點

  1. 針對不同的參數進行不同的處理,針對性強

缺點

  1. 因爲其針對性太強,所以其複用性太差

getopt模塊

簡介

此模塊是python內置的一個模塊。該模塊是專門用來處理命令行參數的。
其基本使用格式如下:

opts, args = getopt.getopt(args, shortopts, longopts = [])

對於getopt()方法的第一個參數,就是我們通過命令行傳入的參數。不過這裏也有一個值得注意的地方,我需要對參數列表進行切片處理。因爲我們獲得的第一個(args[0])命令行參數是當前文件名稱,這並不是我們需要的。
對於getopt()的第二個參數,是shortopts;第三個參數,是longopts
shortopts比如:-h
longopts比如:–help
shortopts是以’-'爲前綴的,longopts是以"- -"爲前綴的.

我們也可以單獨使用短參數。基本使用格式如下:

opts, args = getopt.getopt(sys.argv[1:], "ld:")

實戰用例

from __init__ import *

def usage():
    print 'prama_config.py usage:'
    print '-h, --help:      Print help message.'
    print '-v, --version:   Print script version'
    print '-o, --output:    Input an output verb'
    print '-m, --message:   Send a message to someone.'
    print '--foo:           Test option '
    print '--fre:           Another test option'

def version():
    print 'prama_config.py 1.0.1'

def output(args):
    print 'Hello, %s' % args

def message(sender, receiver, msg):
    print("{0} Send a message to {1}, content is \'{2}\'.".format(sender, receiver, msg))

def main(argv):
    try:
        opts, args = getopt.getopt(argv[1:], 'hvom:', ['help=', 'message=', 'foo=', 'fre='])
    except getopt.GetoptError, err:
        print str(err)
        usage()
        sys.exit(2)
    for o, a in opts:
        if o in ('-h', '--help'):
            usage()
            sys.exit(1)
        elif o in ('-v', '--version'):
            version()
            sys.exit(0)
        elif o in ('-o', '--output'):
            output(a)
            sys.exit(0)
        elif o in ('-m', '--message'):
            message(a, args[0], args[1])
            sys.exit(0)
        else:
            print 'unhandled option'
            sys.exit(3)

if __name__ == '__main__':
    main(sys.argv)


OptionParser模塊

簡介

前面說到getopt,不過getopt太小了,而且從代碼的角度看,面向過程的嫌疑很重。相對getopt,OptionParser就顯得比較專業級了。OptionParser通過*parser.add_option()添加選項參數,再通過parser.parse_args()*進行解析參數選項。整個過程很面向對象
對於OptionParser還有一個優點在於,我們不需要爲OptionParser設置help的選項,help選項已經被內置到模塊當中去了。

parser.add_option()參數說明

  1. action: action是parse_args() 方法的參數之一,它指示 optparse 當解析到一個命令行參數時該如何處理。actions 有一組固定的值可供選擇,默認是’store ‘,表示將命令行參數值保存在 options 對象裏。action的取值有store, store_true, store_false三個;
  2. dest: dest是存儲的變量,命令行的執行命令將會保存到dest指定的值當中。比如,下面代碼中的-p命令,就會被保存到dest="pdcl"指定的options的pdcl變量中;
  3. default: 用於設置上面dest中保存變量的默認值。比如下面的代碼中,我們就將默認值打成了False。那麼,我們通過options.pdclp這個變量訪問到的值就是False;
  4. type: 用於指定dest中保存變量值的數據類型。默認的數據類型爲string
  5. help: 用於指定當前命令的提示信息。

實戰用例

from optparse import OptionParser

parser = OptionParser()

parser.add_option(
    "-p", "--pdbk",
    action="store_true",  # 指示 optparse 當解析到一個命令行參數時該如何處理
    dest="pdcl",  # 存儲的變量
    default=False,
    help="write pdbk data to oracle db"
)

parser.add_option(
    "-z", "--zdbk",
    action="store_true",
    dest="zdcl",  # 存儲的變量
    default=False,
    help="write zdbk data to oracle db"
)

parser.add_option(
    "-f", "--file",  # 操作指令
    action="store",
    dest="filename",  # 存儲的變量
    type="string",  # 變量類型
    help="write report to FILE",  # 顯示的幫助信息
    metavar="FILE"  # 存儲變量的值
)

parser.add_option(
    "-q", "--quiet",
    action="store_false",
    dest="verbose",
    default=True,
    help="don't print status messages to stdout"
)

(options, args) = parser.parse_args()

if options.pdcl is True:
    print 'pdcl is true'
if options.zdcl is True:
    print 'zdcl is true'
if options.filename is not None:
    print("filename={0}".format(options.filename))
    print(args)

通過對上面三種參數解析策略的說明,可以看到這裏使用OptionParser模塊進行解析是最佳方式。


Ref

  • http://blog.csdn.net/tianzhu123/article/details/7655499
  • http://blog.csdn.net/lwnylslwnyls/article/details/8199454
  • 《Python標準庫》

徵集

如果你也需要使用ProcessOn這款在線繪圖工具,可以使用如下邀請鏈接進行註冊:
https://www.processon.com/i/56205c2ee4b0f6ed10838a6d

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章