簡介
Python 中自帶的argparse
模塊可以用于提供簡潔易用的命令行參數(shù)解析桅打。
程序內(nèi)部定義了需要使用的參數(shù)挺尾,argparse
會默認(rèn)自動從 sys.argv
中解析出對應(yīng)的參數(shù)丽柿。argparse
模塊會自動生成幫助信息和使用提示甫题,同時當(dāng)用戶使用無效參數(shù)時坠非,會顯示錯誤原因麻顶。
注: Python 中還有其他兩個模塊可以提供相同的命令行參數(shù)解析功能:
getopt
(等同于 C 語言的getopt()
)和optparse
(Python2.7以后被標(biāo)記為 Deprecated队萤,不會繼續(xù)發(fā)展)要尔。
其中赵辕,argparse
是基于optparse
的進(jìn)一步封裝,因此這兩者擁有相似的使用方法私杜。
參數(shù)類型說明
命令行參數(shù)類型可以分為以下兩種:
-
位置參數(shù)(positional argument):位置參數(shù)擁有一個具體的名字衰粹,以便讓程序知道如何使用其值铝耻。比如
cp SRC DEST
频丘,參數(shù)SRC
和DEST
就是兩個位置參數(shù)椎镣,其值類型為字符串。 -
可選參數(shù)(optional argument):可選參數(shù)用于提供額外信息給到程序,讓程序可以提供額外的一些操作亮钦。比如
ls -a
或ls --all
蜂莉,-a
和--all
就是可選參數(shù)窖张,應(yīng)用程序ls
接收到-a/--all
參數(shù)后宿接,就會使能顯示隱藏文件功能睦霎。
命令行參數(shù)通用格式為:program [optional] positional。
簡單示例
下面列舉一些簡單的例子碑幅,力求對 argparse
有一個初步的了解枕赵。更多詳細(xì)的示例,請參考:Argparse Tutorial
示例1. 添加一個位置參數(shù):square篮昧,其類型為int
:
import argparse
#創(chuàng)建一個參數(shù)解析實例
parser = argparse.ArgumentParser()
#添加參數(shù)解析
parser.add_argument("square", help="display a square of a given number",
type=int)
#開始解析
args = parser.parse_args()
print(args.square**2)
上述代碼生成的程序使用格式為:usage: argTest.py [-h] square
懊昨,因此具體使用應(yīng)類似:$ python3 argTest.py 4
注:argparse
中參數(shù)類型默認(rèn)為字符串(string
)酵颁,可以通過type
參數(shù)指定參數(shù)類型。
實例2. 添加一個可選參數(shù):-v/--verbose:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity")
args = parser.parse_args()
if args.verbose:
print("verbosity turned on")
上述代碼生成的程序使用格式為:usage: argTest.py [-h] [-v VERBOSE]
,可選參數(shù)-v/--verbose
后面必須加上一個值(任意類型)。因此具體使用應(yīng)類似:
$ python3 argTest.py -v 1
verbosity turned on
$ python3 argTest.py --verbose haha
verbosity turned on
通常程序的可選參數(shù)表現(xiàn)形式為布爾值類型:True
,False
刑然。可以通過在方法add_argument
中為參數(shù)加上參數(shù)action
進(jìn)行指定武鲁。
實例3. 為程序添加一個位置參數(shù):square,類型為int
蝠检;同時添加一個布爾類型的可選參數(shù):-v/--verbose:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbose", action="store_true",
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbose:
print("the square of {} equals {}".format(args.square, answer))
else:
print(answer)
上述代碼生成的程序使用格式為:usage: argTest.py [-h] [-v] square
沐鼠,因此具體使用應(yīng)類似:
$ python3 argTest.py
usage: argTest.py [-h] [-v] square
argTest.py: error: the following arguments are required: square
$ python3 argTest.py 4
16
$ python3 argTest.py 4 --verbose
the square of 4 equals 16
$ python3 argTest.py --verbose 4
the square of 4 equals 16
注:action="store_true"
表示當(dāng)顯示指定了可選參數(shù)時,其值為True
叹谁,當(dāng)未指定時饲梭,則為False
。
action="store_false"
與之相反焰檩,當(dāng)未指定參數(shù)時憔涉,其值為True
,當(dāng)顯示指定參數(shù)時,其值為False
。
關(guān)鍵函數(shù)講解
從上面的示例中我們可以看到峦萎,argparse
主要涉及到3個調(diào)用:
-
argparse.ArgumentParser()
:ArgumentParser
是一個類,該類對象內(nèi)部維護(hù)了對命令行參數(shù)解析為 Python 數(shù)據(jù)類型所必須的所有信息悴能。
其構(gòu)造函數(shù)有如下參數(shù)可供使用:
Argument | Description |
---|---|
prog | 應(yīng)用名稱(默認(rèn):sys.argv[0] ) |
usage | 程序使用方法描述 |
description | 顯示在參數(shù)列表幫助信息之前的文本展示(默認(rèn):無) |
epilog | 顯示在參數(shù)列表幫助信息之后的文本展示(默認(rèn):無) |
parents | 需要同時添加的一系列ArgumentParser 對象 |
formatter_class | 自定義幫助信息輸出的類 |
prefix_chars | 可選參數(shù)前綴字符(默認(rèn):‘-‘) |
fromfile_prefix_chars | 參數(shù)文件集前綴字符(默認(rèn):無) |
argument_default | 全局參數(shù)默認(rèn)值(默認(rèn):無) |
conflict_handler | 可選參數(shù)沖突解決策略(通常不需要) |
add_help | 為解析器增加一個-h/--help 選項(默認(rèn):True ) |
allow_abbrev | 允許長選項簡短表示夭拌,只要簡短表示不具備二義性(默認(rèn):True ) |
注:所有參數(shù)均為 關(guān)鍵字參數(shù),需以鍵值對形式進(jìn)行傳參即横。
-
ArgumentParser.add_argument
:定義單個命令行參數(shù)解析規(guī)則。
每個命令行參數(shù)擁有多個詳細(xì)描述,如下所示:
Argument | Description |
---|---|
name or flags | 一個名稱或則參數(shù)字符串列表。e.g. foo or -f, --foo
|
action | 對該參數(shù)的處理動作 |
nargs | 提取的命令行參數(shù)對應(yīng)的值的個數(shù) |
const | 如果命令行沒有傳入該參數(shù)驮宴,const指定該參數(shù)的默認(rèn)值,在某些action與nargs類型下才起作用 |
default | 命令行中如果缺少該參數(shù)钻蔑,則使用該 default 指定的值 |
type | 參數(shù)應(yīng)轉(zhuǎn)化成的類型 |
choices | 參數(shù)允許的值 |
required | 表明參數(shù)是否是必須的扬虚,只對可選參數(shù)有效 |
help | 參數(shù)對應(yīng)的簡短描述 |
metavar | 在使用信息中該參數(shù)對應(yīng)的名稱 |
dest | parse_args()返回的對象對應(yīng)的屬性名稱 |
其中:
action 有如下幾個選項:
-
store
:存儲參數(shù)值岭洲。該行為是默認(rèn)行為侥锦。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.parse_args('--foo 1'.split())
Namespace(foo='1')
-
store_const
:存儲關(guān)鍵字參數(shù) const 指定的值襟衰。該行為最常用于可選參數(shù)作為某些標(biāo)識使用玖详。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_const', const=42)
>>> parser.parse_args(['--foo'])
Namespace(foo=42)
-
store_true
和store_false
:該類型為store_const
用于存儲True
或False
的特例三娩。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_true')
>>> parser.add_argument('--bar', action='store_false')
>>> parser.add_argument('--baz', action='store_false')
>>> parser.parse_args('--foo --bar'.split())
Namespace(foo=True, bar=False, baz=True)
-
append
:該選項存儲一個列表,并且把每個參數(shù)值添加到列表中。對于允許一個選項指定多次的場景很有用反璃。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
-
append_const
:該選項存儲一個列表,并且把關(guān)鍵字參數(shù) const 指定的值存儲進(jìn)列表中俯画。該選項的典型使用場景是把多個具備常量值的參數(shù)存儲進(jìn)同一個列表中爬泥。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--str', dest='types', action='append_const', const=str)
>>> parser.add_argument('--int', dest='types', action='append_const', const=int)
>>> parser.parse_args('--str --int'.split())
Namespace(types=[<class 'str'>, <class 'int'>])
-
count
:該選項統(tǒng)計某一關(guān)鍵字參數(shù)出現(xiàn)的次數(shù)辩越。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--verbose', '-v', action='count')
>>> parser.parse_args(['-vvv'])
Namespace(verbose=3)
-
version
:該選擇需要在 add_argument() 方法中添加關(guān)鍵字參數(shù)version
嘁扼,調(diào)用時會自動打印版本信息并自動退出。
>>> import argparse
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--version', action='version', version='%(prog)s 2.0')
>>> parser.parse_args(['--version'])
PROG 2.0
-
help
:打印完整的參數(shù)幫助信息黔攒。
nargs 有如下幾個選項:
-
N(整型)
:指定參數(shù)后面數(shù)值個數(shù)趁啸,合并到一個列表中。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs=2)
>>> parser.add_argument('bar', nargs=1)
>>> parser.parse_args('c --foo a b'.split())
Namespace(bar=['c'], foo=['a', 'b'])
-
?
:一個命令行參數(shù)值最多只接收一個值(單條目)亏钩。如果沒有對應(yīng)參數(shù)莲绰,則使用 default 指定的值。對于可選參數(shù)姑丑,有一個特例:如果只顯示了參數(shù),但沒有尾隨提供一個值辞友,則使用 const 指定的值栅哀。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='?', const='c', default='d')
>>> parser.add_argument('bar', nargs='?', default='d')
>>> parser.parse_args(['XX', '--foo', 'YY'])
Namespace(bar='XX', foo='YY')
>>> parser.parse_args(['XX', '--foo'])
Namespace(bar='XX', foo='c')
>>> parser.parse_args([])
Namespace(bar='d', foo='d')
-
*
:所有顯示指定的參數(shù)會聚集到一個集合中。通常來說称龙,對多個位置參數(shù)使用nargs='*'
并沒有多大意義留拾,但對于多個可選參數(shù)卻是可以的。
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', nargs='*')
>>> parser.add_argument('--bar', nargs='*')
>>> parser.add_argument('baz', nargs='*')
>>> parser.parse_args('a b --foo x y --bar 1 2'.split())
Namespace(bar=['1', '2'], baz=['a', 'b'], foo=['x', 'y'])
-
+
:與*
一樣鲫尊,將所有顯示指定的參數(shù)聚集到一個列表中痴柔。另外,當(dāng)一個命令行參數(shù)都沒有指定時疫向,會拋出一個錯誤信息咳蔚。
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('foo', nargs='+')
>>> parser.parse_args(['a', 'b'])
Namespace(foo=['a', 'b'])
>>> parser.parse_args([])
usage: PROG [-h] foo [foo ...]
PROG: error: the following arguments are required: foo
-
argparse.REMAINDER
:將剩余的命令行參數(shù)聚集到一個列表中。通常用于命令行工具分發(fā)給其他命令行工具搔驼。
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('--foo')
>>> parser.add_argument('command')
>>> parser.add_argument('args', nargs=argparse.REMAINDER)
>>> print(parser.parse_args('--foo B cmd --arg1 XX ZZ'.split()))
Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B')
如果nargs
關(guān)鍵字參數(shù)未提供谈火,則讀取的參數(shù)個數(shù)由action
決定。通常這意味著將讀取一個命令行參數(shù)并產(chǎn)生一個元素(不是一個列表)舌涨。