天天看點

python argparseargparse

argparse

argparse – Parser for command-line options, arguments and sub-commands

argparse – 就是python用于解析指令行選項,參數和子指令的一個子子產品。

Python 也有第三方的庫可用于指令行解析,而且功能也更加強大,比如 docopt,Click。不過這些我也沒有用過呢。

學習這個子子產品的目的就是為了使用指令行改變參數,一次可以執行不同參數的多個程式,調參就會很友善。

3. argparse-指令行選項與參數解析

argparse子產品作為optparse的一個替代被添加到Python2.7。argparse的實作支援一些不易于添加到optparse以及要求向後不相容API變化的特性,是以以一個新子產品添加到标準庫。

argparse可以提供支援位置參數、子指令、必須選項、”/f”和”+rgb”等選項文法、零個或多個或者一個或多個的參數選項等其他更加豐富靈活的用法。

與optparse相比較

Why use argparse rather than optparse?

argparse的API類似于optparse,甚至在很多情況下通過更新所使用的類名和方法名,使用argparse作為一個簡單的替代。然而,有些地方在添加新特性時不能保持直接相容性。

設定一個解析器

使用argparse的第一步就是建立一個解析器對象,并告訴它将會有些什麼參數。那麼當你的程式運作時,該解析器就可以用于處理指令行參數。

解析器類是

ArgumentParser

。構造方法接收幾個參數來設定用于程式幫助文本的描述資訊以及其他全局的行為或設定。

import argparse
parse = argparse.ArgumentParser(description='This is a python sample program')           

定義參數

argparse是一個全面的參數處理庫。參數可以觸發不同的動作,動作由

add_argument()

方法的 action 參數指定。 支援的動作包括儲存參數(逐個地,或者作為清單的一部分),當解析到某參數時儲存一個常量值(包括對布爾開關真/假值的特殊處理),統計某個參數出現的次數,以及調用一個回調函數。

預設的動作是儲存參數值。在這種情況下,如果提供一個類型,那麼在存儲之前會先把該參數值轉換成該類型。如果提供 dest 參數,參數值就儲存為指令行參數解析時傳回的命名空間對象中名為該 dest 參數值的一個屬性。

舉個例子:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)           

運作代碼:

C:\Users\habits\Anaconda3\python.exe C:/Users/habits/Documents/PycharmProjects/test/python/m_argparse.py
usage: m_argparse.py [-h] echo
m_argparse.py: error: the following arguments are required: echo           

帶參數的話:

C:\Users\habits\Anaconda3\python.exe C:/Users/habits/Documents/PycharmProjects/test/python/m_argparse.py -h
usage: m_argparse.py [-h] echo

positional arguments:
  echo

optional arguments:
  -h, --help  show this help message and exit


C:\Users\habits\Anaconda3\python.exe C:/Users/habits/Documents/PycharmProjects/test/python/m_argparse.py foo
foo           

說明:

  • 上述代碼中使用add_argument()方法指定一個程式接收的指令行選項;
  • 這時在指令行中調用test.py,後必須指定一個選項參數;
  • parse_args()方法則傳回指令行中為選項指定的資料;
  • 位置選項也成為傳回資料的屬性名,通過屬性名可以擷取資料; 上述幫助指令,傳回資訊可以知道echo是一個未知參數,但是其具體如何使用無法得知,為了使其更加豐富易懂,可以在add_argument()内添加其他的屬性。

解析一個指令行

定義了所有參數之後,你就可以給

parse_args()

傳遞一組參數字元串來解析指令行。預設情況下,參數是從

sys.argv[1:]

中擷取,但你也可以傳遞自己的參數清單。選項是使用GNU/POSIX文法來處理的,是以在序列中選項和參數值可以混合。

parse_args() 的傳回值是一個命名空間,包含傳遞給指令的參數。該對象将參數儲存其屬性,是以如果你的參數

dest

"myoption"

,那麼你就可以

args.myoption

來通路該值。

簡單示例

以下簡單示例帶有3個不同的選項:一個布爾選項(-a),一個簡單的字元串選項(-b),以及一個整數選項(-c)。

import argparse

parser = argparse.ArgumentParser(description='Short sample app')

parser.add_argument('-a', action="store_true", default=False)
parser.add_argument('-b', action="store", dest="b")
parser.add_argument('-c', action="store", dest="c", type=int)

print parser.parse_args(['-a', '-bval', '-c', '3'])