
Python作為網紅腳本語言,不少開發(fā)者都會選擇它來完成一些日常工作,提高效率,特別是在Python2.4以后推出的subprogress模塊后,Python與操作系統(tǒng)的交互更加自然,其作為命令行工具開發(fā)語言的便利程度直線上升。開發(fā)命令行工具,解析命令行參數是一個基本功能,Python 中有 argparse(舊的庫為 optparse,已經停止維護)專門解析命令行參數,使用起來非常遍歷。
基本使用
對于一個命令行工具來說,使用argparse實例化一個解析器來接收和處理命令行參數。
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
導入argparse包,實例化一個parser解析器,開始解析。運行結果如下:
$ python3 prog.py
//沒有任何結果
$ python3 prog.py --help
//顯示出usage
usage: prog.py [-h]
optional arguments:
-h, --help show this help message and exit
$ python3 prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
//不能識別--verbose這樣的參數
$ python3 prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo
// 不能識別foo這樣的位置參數
使用argparse來實例化一個解析器以后,會自動增加—help對應的usage,未定義的參數都會有友好的提示。
現(xiàn)在增加一個位置參數:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print(args.echo)
增加一個echo的位置參數,同時使用help參數來表明該參數的說明。
運行:
$ python3 prog.py -h
usage: prog.py [-h] echo
positional arguments:
echo echo the string you use here
optional arguments:
-h, --help show this help message and exit
$ python3 prog.py echo
echo
usage出現(xiàn)echo參數的說明。 當傳入 echo作為位置參數后,print(args.echo)則打印出echo對應的值為字符串echo。
還可以對參數類型進行設置:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number",
type=int)
args = parser.parse_args()
print(args.square**2)
運行:
$ python3 prog.py 4
16
$ python3 prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'
設置類型后,如果出現(xiàn)類型出錯則會報錯。
可選參數
可選參數往往參數名稱前加—,如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
print("verbosity turned on")
運行:
$ python3 prog.py --verbosity 1
verbosity turned on
$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]
optional arguments:
-h, --help show this help message and exit
--verbosity VERBOSITY
increase output verbosity
$ python3 prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument
如果使用了可選參數,但是沒有傳入對應的值,則會報錯,告知—verbosity期望得到一個參數。對于上面的例子,if判斷語句其實只需要verbosity的值為布爾值,則如下設置action:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
print("verbosity turned on")
運行:
$ python3 prog.py --verbose
verbosity turned on
$ python3 prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
$ python3 prog.py --help
usage: prog.py [-h] [--verbose]
optional arguments:
-h, --help show this help message and exit
--verbose increase output verbosity
此時,填寫了verbose可選參數以后,if條件通過,當指定verbose的action為“store_true”的時候,args.verbose則為true,沒有則為false。
短可選參數
—verbose一般為完整的可選參數填寫方式,命令行工具中有一個-加上一個字母的短可選參數的表示,可以像下面這樣設置:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
print("verbosity turned on")
運行:
$ python3 prog.py -v
verbosity turned on
$ python3 prog.py --help
usage: prog.py [-h] [-v]
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase output verbosity
可以看到usage中顯示,-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)
運行:
$ python3 prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
$ python3 prog.py 4
16
$ python3 prog.py 4 --verbose
the square of 4 equals 16
$ python3 prog.py --verbose 4
the square of 4 equals 16
可以變化可選參數的位置,也可以正常運行。
可以設置可選參數的為幾種具體的值,以避免程序出現(xiàn)bug,如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
print("{}^2 == {}".format(args.square, answer))
else:
print(answer)
choices可以設置參數為哪些具體的值。
運行如下:
$ python3 prog.py 4 -v 3
usage: prog.py [-h] [-v {0,1,2}] square
prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
$ python3 prog.py 4 -h
usage: prog.py [-h] [-v {0,1,2}] square
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
-v {0,1,2}, --verbosity {0,1,2}
increase output verbosity
usage同時會出現(xiàn)參數可以填寫的值有哪些。
也可以處理一個可選參數出現(xiàn)多次的情況,以避免參數過于冗長的情況,這種情況很常見:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display the square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity == 1:
print("{}^2 == {}".format(args.square, answer))
else:
print(answer)
action的另一種類型為”count”,可以計算某個可選參數出現(xiàn)的次數。
運行:
$ python3 prog.py 4
16
$ python3 prog.py 4 -v
4^2 == 16
$ python3 prog.py 4 -vv
the square of 4 equals 16
$ python3 prog.py 4 --verbosity --verbosity
the square of 4 equals 16
$ python3 prog.py 4 -v 1
usage: prog.py [-h] [-v] square
prog.py: error: unrecognized arguments: 1
$ python3 prog.py 4 -h
usage: prog.py [-h] [-v] square
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
-v, --verbosity increase output verbosity
$ python3 prog.py 4 -vvv
16
參數可以設置默認值,如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count", default=0,
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity >= 2:
print("the square of {} equals {}".format(args.square, answer))
elif args.verbosity >= 1:
print("{}^2 == {}".format(args.square, answer))
else:
print(answer)
設置默認值以后,verbosity總會有值,且默認為0。
運行:
$ python3 prog.py 4
16
add_argument
函數原型為:
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
該方法定義單個命令行參數,參數說明如下:
- name or flags:任一一個名稱或者是可選參數的list,例如:foo 或 -f, —foo。
- action:獲取的參數該采取何種提取方式。
- nargs: 提取的命令行參數對應的值的個數。
- const: 如果命令行沒有傳入該參數,const指定該參數的默認值,在某些action與nargs類型下才起作用。
- default: 命令行中如果缺少該參數,default來提供值。
- type: 要轉換命令行參數的類型。
- choice: 參數允許的值。
- required : 表明參數是否是必須的,只對可選參數有效。
- help: 對該參數的簡要說明。
- metavar :用于指明在幫助說明中,該參數有意義的值是多少。
- dest: 用于指明該命令行參數在獲取參數時候的屬性是什么。