深入理解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來對實際的引數值做不同的處理,具體在下面解析類分析的時候會詳細介紹。這些屬性是如何配合組合各種各樣的命令介面的,可以查考下面的一串屬性檢查函式來控制:
action屬性檢查
如果aciton=None,則acton預設為store
action支援的型別列表:
ACTIONS = (“store”,”store_const”,”store_true”, “store_false”,”append”,append_const”,”count”,”callback”,”help”,”version”)
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")
choice屬性檢查
如果choices不為None,則type必須是choice型別,反過來,如果type=choice,則choices必須不為None,而且choice必須是元組或者列表
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
- long型別的opts:去掉–,把-轉成_比如
const屬性檢查
const屬性是為了固定某些引數的值而設定的。const屬性只支援
action=["store_const"、"append_const"]
nargs屬性檢查
如果nargs不為None,則
action=["store","append","callback"]
。反過來如果action在這些型別裡面,而nargs=None,則nargs會預設設定為1callback屬性檢查
如果
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
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'}>
處理引數
處理引數會根據
-
和--
分為short_opt和long_opt處理,兩個處理大差不差,以short_opt為例子
short_opt處理- 取出opt例項和opt的value,對value值進行type檢查
- 依據opt例項的action處理其對應的value值
處理函式
處理函式原型如下:
take_action(self, action, dest, opt, value, values, parser)
- action用來區分不同的處理邏輯
- dest用來更新values例項裡面的option例項
- opt作為callback方法的引數values代表這個opt的值
- values是最終要返回回去的values例項
- parse的作用: 1、用來作為callback型別action的方法的引數. 2、列印命令列幫助和版本資訊
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()
- store:直接更新option值:
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