1. 程式人生 > >深入理解python 命令列解析模組optparse(optparse原始碼解讀)

深入理解python 命令列解析模組optparse(optparse原始碼解讀)

optparse是python用來解析命令列引數的,最早是getopt,option比getopt更強大和靈活。最新的命令列解析使用argparse,因此optparse今後將不會再被開發,optparse在python的原始碼位置是Lib/optparse.py。

optparse.py模組主要類結構簡介

optparse裡面包含了幾個主要的類:OptionParser解析類、Option定義類、Values解析結果類。OptionParse是入口,例項化OptionParse類的時候可以通過option_list指定option定義列表,version作為版本管理,另外OptionParse預設會新增一個-h/–help的option,用來列印命令列幫組列表。通過add_option方法可以動態的新增一個option,即例項化一個Option類。Option類裡面會定義一些屬性用來管理各種負責的命令列引數,具體可以看下面option定義的分析。通過parse_args方法可以解析命令列引數,如何解析可以看下面option的解析,解析結果儲存在一個Values解析類例項中。下面可以看一個簡單的例子:

from optparse import OptionParser 
parser = OptionParser() 
parser.add_option(“-f”, “–file”, action=”store”, type=string”, dest=”filename”) 
args=[“-f”, “./foo.txt”] 
(values,args) = parse.parse_args(args) 
print values.filename 
foo.txt 

接下來分兩大類來解析上面這個例子

option定義

add_options的原型是
def add_option(self, args, *kwargs)


在呼叫add_option的時候該如何寫好args和kwargs呢?

1. args類的引數是不帶key值的,比如-f, –file 
2. kwargs類是帶key的,比如action=”store” 

注意:這裡必須嚴格遵循這個規則,Option類會把args當作option選項來解析,把kwargs會被當作option選項的屬性來解析。接下里看下Option如何解析args和kwargs

接下來看下option是如何解析這兩類定義option的引數

args解析

定義規則

1. 如果是兩個字元的,則必須是一個 - 開頭,定義為short_opts,比如:-f
2. 如果是多於兩個字元的,必須是 – 開頭,定義我long_pots,比如:–filename 

kwargs解析

上面有說到kwargs會作為option的屬性,option的支援的屬性列表就是kwargs支援的key列表,因此kwargs支援的key列表如下:ATTRS =[‘action’,’type’,‘dest’,’default’,’nargs’,’const’,’choices’,’callback’,’callback_args’,’callback_kwargs’,’help’,’metavar’]
這些key都會作為option例項的屬性,而這些屬性的作用是控制命令列型別和命令列解析的,各種各樣的命令列型別都是通過這些屬性來配合定義的。在解析的時候,會依據命令列的aciton來對實際的引數值做不同的處理,具體在下面解析類分析的時候會詳細介紹。這些屬性是如何配合組合各種各樣的命令介面的,可以查考下面的一串屬性檢查函式來控制:

  1. action屬性檢查

    如果aciton=None,則acton預設為store
    action支援的型別列表:
    ACTIONS = (“store”,”store_const”,”store_true”, “store_false”,”append”,append_const”,”count”,”callback”,”help”,”version”)

  2. type屬性檢查

    type的支援型別列表:TYPES = (“string”, “int”, “long”, “float”, “complex”, “choice”),其中string可以用str代替。如果Type為None,並且action是[“store”, “append”],這時候如果choices不為None,則type=choice,否則為type=string.如果type不為None,則action是["store","append","callback"]。反過來就是說這些action才支援type屬性。比如下面定義就會出錯
    parser.add_option("-v", "–verbose", action="count",dest="verbosity",type="int")

  3. choice屬性檢查

    如果choices不為None,則type必須是choice型別,反過來,如果type=choice,則choices必須不為None,而且choice必須是元組或者列表

  4. dest屬性檢查

    dest屬性的值會作為Values屬性裡面option例項的名稱,比如上面例子的values.filename,這個filename就是dest傳遞進去的。如果dest=None,這時候如果action在STORE_ACTIONS = ("store","store_const","store_true","store_false","append","append_const","count")裡面或者type不為None的時候,dest會從args裡面解析,也就是從上面的short_opt和long_opt裡面解析:

    • long型別的opts:去掉–,把-轉成_比如--filename > filename --foo-bar > foo_bar2)
    • short型別:去掉-,取後面的字元比如-f > f
  5. const屬性檢查

    const屬性是為了固定某些引數的值而設定的。const屬性只支援action=["store_const"、"append_const"]

  6. nargs屬性檢查

    如果nargs不為None,則action=["store","append","callback"]。反過來如果action在這些型別裡面,而nargs=None,則nargs會預設設定為1

  7. callback屬性檢查

    如果action="callback",則callback屬性一個可呼叫的(具有call方法)屬性,並且callback_args屬性是元組型別,callback_kwargs屬性是字典型別,當然這兩個都不是必須引數。反過來,如果callback、callback_args、callback_kwargs其中的某任何一個屬性不為None,則action必須是”callback”。

option解析

解析函式原型

def parse_args(self, args=None, values=None)
  • args:是一個列表引數,預設是sys.argv[1:]
  • values:是optparse的Values物件,包含所有parse所新增的option values,之所以放這個引數是因為option可以被parse_args會多次被解析,這樣就可以隨時更新option的值
  • 返回值:所有結果過後的option物件(在optparse.py裡面是Values物件)和剩餘沒有解析出來的args

    1. values

      如果values=None,則會根據定義每個option例項的時候給定的default屬性的值來生成一個Values物件,如果option沒有給定default,則就為空,比如上面例子,得出來得values例項就是:
      < Values at 0x1044bc5a8: {'filename': None}>
      如果是
      parser.add_option("-f", "--file", action="store", type="string", dest="filename",default="test.yml")
      則value例項就是:
      < Values at 0x1044bc5a8:: {'filename': 'test.yml'}>

    2. 處理引數

      處理引數會根據 --- 分為short_opt和long_opt處理,兩個處理大差不差,以short_opt為例子
      short_opt處理

      • 取出opt例項和opt的value,對value值進行type檢查
      • 依據opt例項的action處理其對應的value值
    3. 處理函式

      處理函式原型如下:
      take_action(self, action, dest, opt, value, values, parser)

      • action用來區分不同的處理邏輯
      • dest用來更新values例項裡面的option例項
      • opt作為callback方法的引數values代表這個opt的值
      • values是最終要返回回去的values例項
      • parse的作用: 1、用來作為callback型別action的方法的引數. 2、列印命令列幫助和版本資訊
    4. action處理

      具體每個不同的action的處理邏輯

      • store:直接更新option值:setattr(values, dest, value)
      • store_const:取該新增改option的時候給定的const屬性:setattr(values, dest, self.const)
      • store_true:將option的值設定為True值:setattr(values, dest, True)
      • store_false:將option的值設定為False:setattr(values, dest, False)
      • append:將value值追加給option:values.ensure_value(dest, []).append(value)
      • append_const:追加const的值給option:values.ensure_value(dest, []).append(self.const)
      • count:統計次數給option:setattr(values, dest, values.ensure_value(dest, 0) + 1)
      • callback:取出callback_args和callback_kwargs,並呼叫callback方法,具體處理邏輯看自己寫的callback方法
        args = self.callback_args or ()
        kwargs = self.callback_kwargs or {}
        self.callback(self, opt, value, parser, *args, **kwargs)
      • help:列印option的幫助文件,會列印所有已經新增給當前parse例項的option
        parser.print_help()
        parser.exit()
      • version:列印自己定義的版本號,這裡要求使用在例項化OptionParse物件的時候指定vaersion=”124”
        parser.print_version()
        parser.exit()

OptionParse不止只有add_option和parse_args兩個方法,還支援比如批量新增option的add_options,支援option組的add_option_group等等,瞭解了大概的處理流程,其他的可以執行查閱原始碼。

附上幾個簡單的例子

#!/usr/bin/python
#  Filename: optparse-test.py
#   Created: 2016-12-01 21:41:41
#      Desc: TODO (some description)
#    Author: linbing, [email protected]
#   Company: t2cloud

from optparse import OptionParser
def callbacktest(option, opt, value, parse):
    print "-----callback test----"

# parser = OptionParser(version="10.10")
parser = OptionParser(version="112")
# parser = OptionParser()
parser.add_option("-f", "--file", type="string",dest="filename",default="test.yml")
# parser.add_option("-f", "--file", action="store", type="string",dest="filename",default="test.yml")
# parser.add_option("-v", "--verbose", action="count",dest="verbosity",type="int")
parser.add_option("-v", "--verbose", action="count",dest="verbosity")
parser.add_option("-s", "--store_const", action="store_const", dest="const", const="jbjb")
parser.add_option("-c", "--callback", action="callback",dest="call",callback=test, type=str)
parser.add_option("-a", "--append", action="append", dest="append")

# args = ["-f", "foo.txt", "-vvv","-v", "-s", "lb", "-c", "./test.yml", "-a" "bb=cc", "-a", "cc=dd"]
# args  = ["-h"]
# args  = ["--version"]
(options, args) = parser.parse_args(args)
print options.filename
print options.verbosity
print options.const
print options.append
print '----- args ----'
print args

相關推薦

深入理解python 命令解析模組optparse(optparse原始碼解讀)

optparse是python用來解析命令列引數的,最早是getopt,option比getopt更強大和靈活。最新的命令列解析使用argparse,因此optparse今後將不會再被開發,optparse在python的原始碼位置是Lib/optparse

python命令解析模組-argparse

主要參考blog: argparse模組是Python的命令列解析模組,可以很方便的進行引數的傳遞,而不需要修改原始碼。 argparse的使用主要有三步,建立解析物件,新增命令列引數,進行引數的解析 看程式碼和註釋: import argparse

python命令解析模組--argparse

  python命令列解析模組--argparse 目錄 簡介 詳解ArgumentParser方法 詳解add_argument方法   參考文件:  https://www.jianshu.com/p/aac9f8079a53 https://www

python命令解析argparse模組

主要是比較理解兩個函式:parse_args()和parse_known_args() ① parse_args() import argparse import sys parse = arg

常用的python命令解析

常用的python命令列解析庫,這兒介紹3種: 1.argparse 2.click 3.fire   argparse是python自帶的模組,要經歷解析器初始化、引數定義、解析一套流程,使用起來有些繁瑣。 一篇argparse使用的文章:https://ww

Python命令解析器argparse的使用

argparse是Python內建的一個用於命令項選項與引數解析的模組,在編寫指令碼的過程中是非常常用的。 在其使用中主要包含三個步驟: import argparse parser = argparse.ArgumentParser(descripti

Python 命令解析工具 Argparse介紹(二)

今天學習python的argparse模組。看到了這樣一篇文章,連結 http://www.cnblogs.com/jianboqi/archive/2013/01/10/2854726.html,題目是Python 命令列解析工具 Argparse介紹(一),翻譯自pyt

python 命令解析工具 argparse 基本使用

parser = argparse.ArgumentParser() #建立物件 parser.add_argument("file") #新增引數 parser.add_

Python命令引數解析模組argparse

當寫一個Python指令碼時經常會遇到不同引數不同功能的情況,如何做一個更好看的命令幫助資訊以及對命令引數解析呢? 這就需要使用argparse模組 #!/usr/bin/env python # -*- coding: utf-8 -*- import sys import os impor

深入理解Python解析器對模組位置的搜尋順序

最初接觸python時通過http://www.runoob.com/python/python-modules.html的教程學習python的基礎知識。 看模組和包時看到這麼一段話: 定位模組 當你匯入一個模組,Python解析器對模組位置的搜尋順序是: 當前

Python程式設計:使用sys、argparse、click、fire實現命令解析

python實現指令碼命令列的庫有: 內建庫sys 內建庫argparse 第三方庫click 第三方庫fire 內建庫sys sys.argv 包含命令列引數列表,第一個引數是檔名 sys_demo.py import sys d

python常用的命令解析

1、argparse argparse是python自帶的模組,要經歷解析器初始化、引數定義、解析一套流程,使用起來有些繁瑣。 argpase的使用: class Calculator(object): """ 計算器 """

python命令引數解析

一、getopt模組  getopt.getopt(args, options[, long_options]) args為需要解析的命令列引數列表,一般為sys.argv[1:],這是因為argv[0]為指令碼的路徑。 options為希望識別的引數,如果該命令列引數

python 命令引數解析 argparse簡單分析

在python 2.7 後,不推薦使用 optparse, 而推薦使用 argparse. 其它的不多說,簡單的分析下我遇到的問題:我是想用 argparse 來解析不定長的命令列引數 例如: import argparse import sys parser = ar

python命令解析argparse

# -*- coding: utf-8 -*- import argparse args = "-f hello.txt -n 1 2 3 -x 100 -y b -z a -q hello @args.txt i_am_bar -h".split() # 使用

python 命令引數——argparse模組的使用

以下內容主要來自:http://wiki.jikexueyuan.com/project/explore-python/Standard-Modules/argparse.html argparse 使用 簡單示例 我們先來看一個簡單示例。主要有三個步驟: 建立 ArgumentParser(

Python中的命令解析工具介紹

轉自新浪微博:@孔令賢HW; ++++++++++++++++++++++ sys.argv 最簡單、最原始的方法就是手動解析了。 import sysdefTestSys():for arg in sys.argv[1:]:print(arg) getopt

深入理解python的生成器表示式和列表解析

前言       沒有用過的東西,沒有深刻理解的東西很難說自己會,而且被別人一問必然破綻百出。雖然之前有接觸過python協程的概念,但是隻是走馬觀花,這兩天的一次交談中,別人問到了協程,頓時語塞,死活想不起來曾經看過的東西,之後突然想到了yield,但為時已晚,只能說

Python命令選項引數解析策略

概述 在Python的專案開發過程中,我們有時需要為程式提供一些可以通過命令列進行呼叫的介面。不過,並不是直接使用 command + 當前檔案 就ok的,我們需要對其設定可選的各種各樣的操作型別。所以,這種情況下我們就有必要對傳入的引數進行解析操作。下面就此

python命令引數處理:argparse、optparse和getopt

一 命令列引數: (1)在python中: *sys.argv:命令列引數的列表。 *len(sys.argv):命令列引數的個數(argc)。 *python中提供了三個模組來輔助處理命令列引數:getopt,optparse和argparse。 (2)術語: *arg