介紹
argparse 模塊使編寫用戶友好的命令行界面變得容易峦睡。
該程序定義了它需要的參數(shù)翎苫,而 argparse 將弄清楚如何從 sys.argv 中解析出這些參數(shù)。 argparse 模塊還自動(dòng)生成幫助和使用消息榨了,并在用戶給程序無效參數(shù)時(shí)發(fā)出錯(cuò)誤煎谍。
官方參考:https://pypi.org/project/argparse/
安裝
pip install argparse
使用舉例
基本使用
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
執(zhí)行結(jié)果
[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ python test.py --help
usage: test.py [-h]
optional arguments:
-h, --help show this help message and exit
設(shè)置默認(rèn)參數(shù)函數(shù)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print args.echo
執(zhí)行結(jié)果
[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ python test.py abcd
abcd
使用--help,發(fā)現(xiàn)echo是必填項(xiàng)
[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ python test.py --help
usage: test.py [-h] echo
positional arguments:
echo
optional arguments:
-h, --help show this help message and exit
定義可選參數(shù)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
print "verbosity turned on : " + args.verbosity
--help:
[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ python test.py --help
usage: test.py [-h] [-v VERBOSITY]
optional arguments:
-h, --help show this help message and exit
-v VERBOSITY, --verbosity VERBOSITY
increase output verbosity
執(zhí)行命令龙屉,這個(gè)參數(shù)可以沒有
[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ python test.py
[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$
這個(gè)參數(shù)也可以有
[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ python test.py -v dasda
verbosity turned on : dasda
如果用省略方法 -v 賦值的方法呐粘,最終會(huì)到達(dá) --verbosity 值會(huì)傳遞到這個(gè)完整的參數(shù)中去。這里值得一提的是转捕,如果沒有后面的 --verbosity 只有 -v 的話作岖,那么值會(huì)可以通過 args.v 得到
也有可以不指定值的方法,可以讓此值直接默認(rèn)設(shè)置為 bool 值五芝,而使用 action='store_true' 可以做到
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", help="increase output verbosity", action="store_true")
args = parser.parse_args()
print args.verbosity
[mapengcheng02@bjhw-sys-rpm02800a035.bjhw.baidu.com monitor]$ python test.py -v
True
name or flags
add_argument() 方法必須知道它是否是一個(gè)選項(xiàng)痘儡,例如 -f 或 --foo,或是一個(gè)位置參數(shù)与柑,例如一組文件名谤辜。第一個(gè)傳遞給 add_argument() 的參數(shù)必須是一系列 flags 或者是一個(gè)簡單的參數(shù)名。例如价捧,可以選項(xiàng)可以被這樣創(chuàng)建:
parser.add_argument('-f', '--foo')
而位置參數(shù)可以這么創(chuàng)建:
parser.add_argument('bar')
當(dāng) parse_args() 被調(diào)用丑念,選項(xiàng)會(huì)以 - 前綴識(shí)別,剩下的參數(shù)則會(huì)被假定為位置參數(shù):
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args(['BAR'])
Namespace(bar='BAR', foo=None)
>>> parser.parse_args(['BAR', '--foo', 'FOO'])
Namespace(bar='BAR', foo='FOO')
>>> parser.parse_args(['--foo', 'FOO'])
usage: PROG [-h] [-f FOO] bar
PROG: error: the following arguments are required: bar
action
ArgumentParser 對(duì)象將命令行參數(shù)與動(dòng)作相關(guān)聯(lián)结蟋。這些動(dòng)作可以做與它們相關(guān)聯(lián)的命令行參數(shù)的任何事脯倚,盡管大多數(shù)動(dòng)作只是簡單的向 parse_args() 返回的對(duì)象上添加屬性。action 命名參數(shù)指定了這個(gè)命令行參數(shù)應(yīng)當(dāng)如何處理嵌屎。供應(yīng)的動(dòng)作有:
'store' - 存儲(chǔ)參數(shù)的值推正。這是默認(rèn)的動(dòng)作
例如:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.parse_args('--foo 1'.split())
Namespace(foo='1')
'store_const' - 存儲(chǔ)被 const 命名參數(shù)指定的值
'store_const' 動(dòng)作通常用在選項(xiàng)中來指定一些標(biāo)志。例如:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_const', const=42)
>>> parser.parse_args(['--foo'])
Namespace(foo=42)
'store_true' and 'store_false'
這些是 'store_const' 分別用作存儲(chǔ) True 和 False 值的特殊用例宝惰。另外植榕,它們的默認(rèn)值分別為 False 和 True。例如:
>>> 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' - 存儲(chǔ)一個(gè)列表
將每個(gè)參數(shù)值追加到列表中尼夺。在允許多次使用選項(xiàng)時(shí)很有用尊残。例如:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='append')
>>> parser.parse_args('--foo 1 --foo 2'.split())
Namespace(foo=['1', '2'])
'append_const'
存儲(chǔ)一個(gè)列表拐邪,并將 const 命名參數(shù)指定的值追加到列表中慰毅。(注意 const 命名參數(shù)默認(rèn)為 None婶芭。)'append_const'
動(dòng)作一般在多個(gè)參數(shù)需要在同一列表中存儲(chǔ)常數(shù)時(shí)會(huì)有用。例如:
>>> 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'>])
nargs
ArgumentParser 對(duì)象通常關(guān)聯(lián)一個(gè)單獨(dú)的命令行參數(shù)到一個(gè)單獨(dú)的被執(zhí)行的動(dòng)作贵扰。 nargs 命名參數(shù)關(guān)聯(lián)不同數(shù)目的命令行參數(shù)到單一動(dòng)作纹坐。支持的值有:
N (一個(gè)整數(shù))
命令行中的 N 個(gè)參數(shù)會(huì)被聚集到一個(gè)列表中球切。 例如:
>>> 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'])
?
如果可能的話糙臼,會(huì)從命令行中消耗一個(gè)參數(shù)怠堪,并產(chǎn)生一個(gè)單一項(xiàng)璧针。如果當(dāng)前沒有命令行參數(shù)绘证,則會(huì)產(chǎn)生 default 值。注意,對(duì)于選項(xiàng),有另外的用例 - 選項(xiàng)字符串出現(xiàn)但沒有跟隨命令行參數(shù),則會(huì)產(chǎn)生 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')
nargs='?' 的一個(gè)更普遍用法是允許可選的輸入或輸出文件:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),
... default=sys.stdin)
>>> parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),
... default=sys.stdout)
>>> parser.parse_args(['input.txt', 'output.txt'])
Namespace(infile=<_io.TextIOWrapper name='input.txt' encoding='UTF-8'>,
outfile=<_io.TextIOWrapper name='output.txt' encoding='UTF-8'>)
>>> parser.parse_args([])
Namespace(infile=<_io.TextIOWrapper name='<stdin>' encoding='UTF-8'>,
outfile=<_io.TextIOWrapper name='<stdout>' encoding='UTF-8'>)
*
所有當(dāng)前命令行參數(shù)被聚集到一個(gè)列表中名斟。注意通過 nargs='*' 來實(shí)現(xiàn)多個(gè)位置參數(shù)通常沒有意義,但是多個(gè)選項(xiàng)是可能的。例如:
>>> 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'])
type -- 類型
默認(rèn)情況下列疗,解析器會(huì)將命令行參數(shù)當(dāng)作簡單字符串讀入告材。 然而坤次,命令行字符串經(jīng)常應(yīng)當(dāng)被解讀為其他類型,例如 float 或 int。 add_argument() 的 type 關(guān)鍵字允許執(zhí)行任何必要的類型檢查和類型轉(zhuǎn)換疤剑。
如果 type 關(guān)鍵字使用了 default 關(guān)鍵字,則類型轉(zhuǎn)換器僅會(huì)在默認(rèn)值為字符串時(shí)被應(yīng)用误续。
傳給 type 的參數(shù)可以是任何接受單個(gè)字符串的可調(diào)用對(duì)象。 如果函數(shù)引發(fā)了 ArgumentTypeError, TypeError 或 ValueError腺办,異常會(huì)被捕獲并顯示經(jīng)過良好格式化的錯(cuò)誤消息焰手。 其他異常類型則不會(huì)被處理。
普通內(nèi)置類型和函數(shù)可被用作類型轉(zhuǎn)換器:
import argparse
import pathlib
parser = argparse.ArgumentParser()
parser.add_argument('count', type=int)
parser.add_argument('distance', type=float)
parser.add_argument('street', type=ascii)
parser.add_argument('code_point', type=ord)
parser.add_argument('source_file', type=open)
parser.add_argument('dest_file', type=argparse.FileType('w', encoding='latin-1'))
parser.add_argument('datapath', type=pathlib.Path)
choices
某些命令行參數(shù)應(yīng)當(dāng)從一組受限值中選擇躬拢。 這可通過將一個(gè)容器對(duì)象作為 choices 關(guān)鍵字參數(shù)傳給 add_argument() 來處理躲履。 當(dāng)執(zhí)行命令行解析時(shí),參數(shù)值將被檢查聊闯,如果參數(shù)不是可接受的值之一就將顯示錯(cuò)誤消息:
>>> parser = argparse.ArgumentParser(prog='game.py')
>>> parser.add_argument('move', choices=['rock', 'paper', 'scissors'])
>>> parser.parse_args(['rock'])
Namespace(move='rock')
>>> parser.parse_args(['fire'])
usage: game.py [-h] {rock,paper,scissors}
game.py: error: argument move: invalid choice: 'fire' (choose from 'rock',
'paper', 'scissors')
請(qǐng)注意 choices 容器包含的內(nèi)容會(huì)在執(zhí)行任意 type 轉(zhuǎn)換之后被檢查工猜,因此 choices 容器中對(duì)象的類型應(yīng)當(dāng)與指定的 type 相匹配:
>>> parser = argparse.ArgumentParser(prog='doors.py')
>>> parser.add_argument('door', type=int, choices=range(1, 4))
>>> print(parser.parse_args(['3']))
Namespace(door=3)
>>> parser.parse_args(['4'])
usage: doors.py [-h] {1,2,3}
doors.py: error: argument door: invalid choice: 4 (choose from 1, 2, 3)