Argparse的使用
本文翻譯自:Argparse
讓我們先從簡單例子入手:
使用argparse的第一步就是創建一個解析器對象,並告訴它將會有些什麼參數。那麼當你的程序運行時,該解析器就可以用於處理命令行參數。
解析器類是ArgumentParser 。構造方法接收幾個參數來設置用於程序幫助文本的描述信息以及其他全局的行為或設置。
import argparseparser = argparse.ArgumentParser()parser.parse_args()輸出結果如下:$ python prog.py$ python prog.py --helpusage: prog.py [-h]optional arguments: -h, --help show this help message and exit$ python prog.py --verboseusage: prog.py [-h]prog.py: error: unrecognized arguments: --verbose$ python prog.py foousage: prog.py [-h]prog.py: error: unrecognized arguments: foo
可以看到--help 也可以簡寫為-h, 是唯一一種我們可以不用通過自己定義就輸出的操作,這也是Argparse特點所在。
讓我們開始增加一點小小的改動:
import argparseparser = argparse.ArgumentParser()parser.add_argument("echo")args = parser.parse_args()print args.echo輸出結果如下:$ python prog.pyusage: prog.py [-h] echoprog.py: error: the following arguments are required: echo$ python prog.py --helpusage: prog.py [-h] echopositional arguments: echooptional arguments: -h, --help show this help message and exit$ python prog.py foofoo
在上述代碼中,add_argument增加了一個叫做echo的變數,由於沒定義數據類型,所以default類型是string類型,這樣就可以print出結果。注意,這裡的parse_args() 事實上是返回變數,比如這裡的echo.
接著,我們可以為我們的操作註明下幫助信息:
import argparseparser = argparse.ArgumentParser()parser.add_argument("echo", help="echo the string you use here")args = parser.parse_args()print args.echo輸出結果如下:$ python prog.py -husage: prog.py [-h] echopositional arguments: echo echo the string you use hereoptional arguments: -h, --help show this help message and exit
現在,讓我們對我們的代碼多加些有趣的操作:
import argparseparser = argparse.ArgumentParser()parser.add_argument("square", help="display a square of a given number")args = parser.parse_args()print args.square**2輸出結果如下:$ python prog.py 4Traceback (most recent call last): File "prog.py", line 5, in <module> print args.square**2TypeError: unsupported operand type(s) for ** or pow(): str and int
我們的願意是想輸出一個數的平方,但我在之前也說過,在不指定數據類型情況下,默認數據類型為string,因此這裡才出現錯誤,所以我們只需要指定下數據類型就可以。
import argparseparser = argparse.ArgumentParser()parser.add_argument("square", help="display a square of a given number", type=int)args = parser.parse_args()print args.square**2輸出結果如下:$ python prog.py 416$ python prog.py fourusage: prog.py [-h] squareprog.py: error: argument square: invalid int value: four
通過type操作我們就解決了這個問題。
到此之前,我們前面所說的參數類型都是固定參數,現在,讓我們引入可選參數的設置!
import argparseparser = argparse.ArgumentParser()parser.add_argument("--verbosity", help="increase output verbosity")args = parser.parse_args()if args.verbosity: print "verbosity turned on"輸出結果如下:$ python prog.py --verbosity 1verbosity turned on$ python prog.py$ python prog.py --helpusage: prog.py [-h] [--verbosity VERBOSITY]optional arguments: -h, --help show this help message and exit --verbosity VERBOSITY increase output verbosity$ python prog.py --verbosityusage: prog.py [-h] [--verbosity VERBOSITY]prog.py: error: argument --verbosity: expected one argument
由上面可以知道,所謂可選參數與固定參數的區別其實只是多了"--"來進行區分,並且一般可選參數會加入一個判斷語句,判斷是否被選中。
讓我們繼續來探究可選參數一些有趣的操作
import argparseparser = argparse.ArgumentParser()parser.add_argument("--verbose", help="increase output verbosity", action="store_true")args = parser.parse_args()if args.verbose: print "verbosity turned on"輸出結果如下:$ python prog.py --verboseverbosity turned on$ python prog.py --verbose 1usage: prog.py [-h] [--verbose]prog.py: error: unrecognized arguments: 1$ python prog.py --helpusage: prog.py [-h] [--verbose]optional arguments: -h, --help show this help message and exit --verbose increase output verbosity
可以看到,在add_argument那裡多加了一個action="store_true",這個意思是如果可選參數被提到,那麼就自動將其args.verbose賦值為true,否則為false.
import argparseparser = 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"輸出結果如下:$ python prog.py -vverbosity turned on$ python prog.py --helpusage: prog.py [-h] [-v]optional arguments: -h, --help show this help message and exit -v, --verbose increase output verbosity
linux用戶都知道,如果我們在使用命令行時,每次都要打那麼多字,那勢必是非常痛苦的,因此parser也提供了很好的短命令形式。如上所示
接下來,讓我們接觸更多複雜的形式。
import argparseparser = 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**2if args.verbose: print "the square of {} equals {}".format(args.square, answer)else: print answer結果如下:$ python prog.pyusage: prog.py [-h] [-v] squareprog.py: error: the following arguments are required: square$ python prog.py 416$ python prog.py 4 --verbosethe square of 4 equals 16$ python prog.py --verbose 4the square of 4 equals 16
在這裡我們把固定變數和可選變數連接起來。
import argparseparser = argparse.ArgumentParser()parser.add_argument("square", type=int, help="display a square of a given number")parser.add_argument("-v", "--verbosity", type=int, help="increase output verbosity")args = parser.parse_args()answer = args.square**2if 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結果如下:$ python prog.py 416$ python prog.py 4 -vusage: prog.py [-h] [-v VERBOSITY] squareprog.py: error: argument -v/--verbosity: expected one argument$ python prog.py 4 -v 14^2 == 16$ python prog.py 4 -v 2the square of 4 equals 16$ python prog.py 4 -v 316
這段代碼只是邏輯問題,認真看,應該很容易看懂。
import argparseparser = 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**2if 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結果如下:$ python prog.py 4 -v 3usage: prog.py [-h] [-v {0,1,2}] squareprog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)$ python prog.py 4 -husage: prog.py [-h] [-v {0,1,2}] squarepositional arguments: square display a square of a given numberoptional arguments: -h, --help show this help message and exit -v {0,1,2}, --verbosity {0,1,2} increase output verbosity
這裡加入choice操作,限制了可選變數的取值。
import argparseparser = 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**2if 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結果如下:$ python prog.py 416$ python prog.py 4 -v4^2 == 16$ python prog.py 4 -vvthe square of 4 equals 16$ python prog.py 4 --verbosity --verbositythe square of 4 equals 16$ python prog.py 4 -v 1usage: prog.py [-h] [-v] squareprog.py: error: unrecognized arguments: 1$ python prog.py 4 -husage: prog.py [-h] [-v] squarepositional arguments: square display a square of a given numberoptional arguments: -h, --help show this help message and exit -v, --verbosity increase output verbosity$ python prog.py 4 -vvv16
這裡同樣是action設置問題,當action設置為count時,程序會自動計數可選變數關鍵詞的數量,並將其賦值給可選變數。
繼續對其完善操作
import argparseparser = argparse.ArgumentParser()parser.add_argument("square", type=int, help="display a square of a given number")parser.add_argument("-v", "--verbosity", action="count", help="increase output verbosity")args = parser.parse_args()answer = args.square**2# bugfix: replace == with >=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結果如下:$ python prog.py 4 -vvvthe square of 4 equals 16$ python prog.py 4 -vvvvthe square of 4 equals 16$ python prog.py 4Traceback (most recent call last): File "prog.py", line 11, in <module> if args.verbosity >= 2:TypeError: unorderable types: NoneType() >= int()
對於這個bug,我們可以通過加入default來解決,default主要是對比輸入整數與0大小,並且賦值,如下:
import argparseparser = 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**2if 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結果如下:$ python prog.py 416
讓我們把問題在繼續弄複雜點:
import argparseparser = argparse.ArgumentParser()parser.add_argument("x", type=int, help="the base")parser.add_argument("y", type=int, help="the exponent")parser.add_argument("-v", "--verbosity", action="count", default=0)args = parser.parse_args()answer = args.x**args.yif args.verbosity >= 2: print "{} to the power {} equals {}".format(args.x, args.y, answer)elif args.verbosity >= 1: print "{}^{} == {}".format(args.x, args.y, answer)else: print answer結果如下:$ python prog.pyusage: prog.py [-h] [-v] x yprog.py: error: the following arguments are required: x, y$ python prog.py -husage: prog.py [-h] [-v] x ypositional arguments: x the base y the exponentoptional arguments: -h, --help show this help message and exit -v, --verbosity$ python prog.py 4 2 -v4^2 == 16
還有一個如下:
import argparseparser = argparse.ArgumentParser()parser.add_argument("x", type=int, help="the base")parser.add_argument("y", type=int, help="the exponent")parser.add_argument("-v", "--verbosity", action="count", default=0)args = parser.parse_args()answer = args.x**args.yif args.verbosity >= 2: print "Running {}".format(__file__)if args.verbosity >= 1: print "{}^{} ==".format(args.x, args.y),print answer結果如下:$ python prog.py 4 216$ python prog.py 4 2 -v4^2 == 16$ python prog.py 4 2 -vvRunning prog.py4^2 == 16
上面兩個都是比較好理解的,在把握了基本操作後,應該都可以解決。
讓我們開始接觸些難的:
import argparseparser = argparse.ArgumentParser()group = parser.add_mutually_exclusive_group()group.add_argument("-v", "--verbose", action="store_true")group.add_argument("-q", "--quiet", action="store_true")parser.add_argument("x", type=int, help="the base")parser.add_argument("y", type=int, help="the exponent")args = parser.parse_args()answer = args.x**args.yif args.quiet: print answerelif args.verbose: print "{} to the power {} equals {}".format(args.x, args.y, answer)else: print "{}^{} == {}".format(args.x, args.y, answer)結果如下:$ python prog.py 4 24^2 == 16$ python prog.py 4 2 -q16$ python prog.py 4 2 -v4 to the power 2 equals 16$ python prog.py 4 2 -vqusage: prog.py [-h] [-v | -q] x yprog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose$ python prog.py 4 2 -v --quietusage: prog.py [-h] [-v | -q] x yprog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
add_mutually_exclusive_group()主要是解決衝突用的
import argparseparser = argparse.ArgumentParser(description="calculate X to the power of Y")group = parser.add_mutually_exclusive_group()group.add_argument("-v", "--verbose", action="store_true")group.add_argument("-q", "--quiet", action="store_true")parser.add_argument("x", type=int, help="the base")parser.add_argument("y", type=int, help="the exponent")args = parser.parse_args()answer = args.x**args.yif args.quiet: print answerelif args.verbose: print "{} to the power {} equals {}".format(args.x, args.y, answer)else: print "{}^{} == {}".format(args.x, args.y, answer)結果如下:$ python prog.py --helpusage: prog.py [-h] [-v | -q] x ycalculate X to the power of Ypositional arguments: x the base y the exponentoptional arguments: -h, --help show this help message and exit -v, --verbose -q, --quiet
這個與之前的同理。
最後一點總結,雖然全程都在copy代碼,但這個教程確實是極好的,對於初學者很容易入門,之後有時間我會再出一個高級的版本~~
推薦閱讀:
※馬哥培訓,無恥的抄襲。
※Python做selenium自動化測試,HTMLTestRunner無法生成
※Python3 是否已經完成了取代 Python2 的歷史進程?
※Python 中的 for 循環如何使用?
TAG:Python |
