這篇 Python學(xué)習(xí)教程主要是對(duì) argparse(Python標(biāo)準(zhǔn)庫(kù)中推薦的命令行解析模塊) 進(jìn)行簡(jiǎn)要介紹。
成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供綏化網(wǎng)站建設(shè)、綏化做網(wǎng)站、綏化網(wǎng)站設(shè)計(jì)、綏化網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、綏化企業(yè)網(wǎng)站模板建站服務(wù),十載綏化做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
note 還有兩個(gè)其他模塊也可以完成相同的任務(wù),分別是 getopt(與C語(yǔ)言中的 getopt() 等效)和已經(jīng)過(guò)時(shí)的 optparse。需要注意的是 argparse 也是基于 optparse,因此在用法上非常相似。
概念
讓我們通過(guò)使用 ls 命令來(lái)展示我們將在本 Python學(xué)習(xí)教程入門中探索的功能類型:
$ ls cpython devguide prog.py pypy rm-unused-function.patch $ ls pypy ctypes_configure demo dotviewer include lib_pypy lib-python ... $ ls -l total 20 drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython drwxr-xr-x 4 wena wena 4096 Feb 8 12:04 devguide -rwxr-xr-x 1 wena wena 535 Feb 19 00:05 prog.py drwxr-xr-x 14 wena wena 4096 Feb 7 00:59 pypy -rw-r--r-- 1 wena wena 741 Feb 18 01:01 rm-unused-function.patch $ ls --help Usage: ls [OPTION]... [FILE]... List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuvSUX nor --sort is specified. ...
從這四個(gè)命令中我們可以學(xué)到一些概念:
基礎(chǔ)用法
讓我們從一個(gè)非常簡(jiǎn)單的例子開(kāi)始,這個(gè)例子幾乎什么事情都沒(méi)做:
import argparse parser = argparse.ArgumentParser() parser.parse_args()
下面是執(zhí)行這段代碼的結(jié)果:
$ python3 prog.py $ python3 prog.py --help 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 $ python3 prog.py foo usage: prog.py [-h] prog.py: error: unrecognized arguments: foo
下面是這段代碼做了什么的解釋:
位置參數(shù)介紹
一個(gè)例子:
import argparse parser = argparse.ArgumentParser() parser.add_argument("echo") args = parser.parse_args() print(args.echo)
運(yùn)行這段代碼:
import argparse parser = argparse.ArgumentParser() parser.add_argument("echo") args = parser.parse_args() print(args.echo)
代碼解釋:
然而請(qǐng)注意,盡管幫助信息看起來(lái)不錯(cuò),但目前并不是很有用。例如,我們看到了我們將 echo 作為了位置參數(shù),但除了猜測(cè)和閱讀源代碼外,我們不知道它的作用。因此,讓我們將它變得更加有用:
import argparse parser = argparse.ArgumentParser() parser.add_argument("echo", help="echo the string you use here") args = parser.parse_args() print(args.echo)
這時(shí)我們將得到:
$ 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
現(xiàn)在,讓我們來(lái)做一些更有用的事情:
import argparse parser = argparse.ArgumentParser() parser.add_argument("square", help="display a square of a given number") args = parser.parse_args() print(args.square**2)
上面代碼執(zhí)行的結(jié)果如下:
$ python3 prog.py 4 Traceback (most recent call last): File "prog.py", line 5, in <module> print(args.square**2) TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
結(jié)果不是很好,這是因?yàn)?argparse 將我們給的選項(xiàng)當(dāng)成了字符串,除非我們手動(dòng)指定類型。因此,讓我們來(lái)告訴 argparse 將它視為一個(gè)整數(shù):
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)
下面是上述代碼的執(zhí)行結(jié)果:
$ python3 prog.py 4 16 $ python3 prog.py four usage: prog.py [-h] square prog.py: error: argument square: invalid int value: 'four'
結(jié)果很好,程序甚至可以在執(zhí)行前因?yàn)殄e(cuò)誤輸入而結(jié)束。
可選參數(shù)介紹
到目前為止,我們已經(jīng)介紹過(guò)了位置參數(shù)。接下來(lái)讓我們看下如何添加一個(gè)可選參數(shù):
import argparse parser = argparse.ArgumentParser() parser.add_argument("--verbosity", help="increase output verbosity") args = parser.parse_args() if args.verbosity: print("verbosity turned on")
運(yùn)行結(jié)果:
$ 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
代碼解釋如下:
上面的例子對(duì)于 --verbosity 還可以接受任意整數(shù),但對(duì)我們的程序來(lái)說(shuō),只有 True 和 False 是有用的。因此我們修改代碼如下:
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")
結(jié)果如下:
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
代碼解釋如下:
短選項(xiàng)
如果你熟悉命令行的用法,你們發(fā)現(xiàn)目前為止我還沒(méi)有涉及這個(gè)選項(xiàng)的簡(jiǎn)短版本的話題。下面是一個(gè)很簡(jiǎn)單的示例:
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")
執(zhí)行結(jié)果如下:
$ 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
注意在幫助信息中反映了這個(gè)新的功能。
位置參數(shù)與可選參數(shù)的結(jié)合
我們的程序變得越來(lái)越復(fù)雜了:
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
我們?nèi)绾巫屛覀冞@個(gè)程序具有多個(gè) verbosity 值,并實(shí)際使用這些值:
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, 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)
輸出如下:
$ python3 prog.py 4 16 $ python3 prog.py 4 -v usage: prog.py [-h] [-v VERBOSITY] square prog.py: error: argument -v/--verbosity: expected one argument $ python3 prog.py 4 -v 1 4^2 == 16 $ python3 prog.py 4 -v 2 the square of 4 equals 16 $ python3 prog.py 4 -v 3 16
上面結(jié)果除了最后一個(gè)看上去都沒(méi)問(wèn)題。最后一個(gè)暴露了我們程序的一個(gè) bug。讓我們通過(guò)限制 verbosity 可接受的值來(lái)修復(fù)它:
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)
輸出如下:
$ 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
需要注意的是,對(duì)應(yīng)的改變?cè)趫?bào)錯(cuò)信息和幫助信息中都有體現(xiàn)。
現(xiàn)在,讓我們用另外一種更通用的方式來(lái)使用 verbosity 選項(xiàng)。這種方式與 CPython 解釋器中處理 verbosity 選項(xiàng)相同(可通過(guò) python --help 查看):
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",它用于計(jì)算一個(gè)可選參數(shù)出現(xiàn)的次數(shù):
$ 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
是的,現(xiàn)在我們的腳本比之前的版本多了一個(gè)標(biāo)識(shí)(類似于之前的 action="store_true")??梢栽趫?bào)錯(cuò)信息中看到這一解釋。
它和 "store_action" 的作用類似。
這里是對(duì) "count" 作用的證明。你可以在之前已經(jīng)看到過(guò)這一個(gè)用法。
如果你不指定 -v 標(biāo)識(shí),這個(gè)標(biāo)識(shí)被認(rèn)為是 None。
正如我們認(rèn)為的一樣,當(dāng)我們使用長(zhǎng)選項(xiàng),輸出結(jié)果仍然是一樣的。
然而,我們的幫助信息對(duì)這一個(gè)新功能解釋得不是很好,但這一點(diǎn)仍舊是可以通過(guò)修改腳本代碼來(lái)修復(fù)的(通過(guò) help 關(guān)鍵字)。
最后一個(gè)輸出暴露了我們程序的一個(gè) bug。
讓我們來(lái)修復(fù)它:
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", 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)
輸出如果如下:
$ python3 prog.py 4 -vvv the square of 4 equals 16 $ python3 prog.py 4 -vvvv the square of 4 equals 16 $ python3 prog.py 4 Traceback (most recent call last): File "prog.py", line 11, in <module> if args.verbosity >= 2: TypeError: '>=' not supported between instances of 'NoneType' and 'int'
開(kāi)始的輸出結(jié)果很理想,并且修復(fù)了之前的bug。也就是說(shuō),我們希望任何 >=2的值都盡可能詳細(xì)。
第三個(gè)輸出結(jié)果不是很理想
讓我們修復(fù)這個(gè) 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", 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)
我們剛剛引入了另外一個(gè)關(guān)鍵詞:default。我們把它設(shè)置為 0 是為了讓它可以進(jìn)行整數(shù)比較。記住,默認(rèn)情況下,如果一個(gè)可選參數(shù)沒(méi)有被指定,它將得到 None 值,它不能進(jìn)行整數(shù)比較(因此會(huì)報(bào) TypeError 異常)。
這時(shí)我們?cè)賵?zhí)行:
$ python3 prog.py 4 16
就目前為止所學(xué)到的東西,您可以走的很遠(yuǎn),而且我們只是從頭開(kāi)始。 argparse模塊功能非常強(qiáng)大,在結(jié)束本教程之前,我們將對(duì)其進(jìn)行更多的探索。
深入一點(diǎn)
如果我們想擴(kuò)展我們的小程序以執(zhí)行其他冪運(yùn)算,而不僅僅是做平方:
import argparse parser = 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.y if 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)
輸出:
$ python3 prog.py usage: prog.py [-h] [-v] x y prog.py: error: the following arguments are required: x, y $ python3 prog.py -h usage: prog.py [-h] [-v] x y positional arguments: x the base y the exponent optional arguments: -h, --help show this help message and exit -v, --verbosity $ python3 prog.py 4 2 -v 4^2 == 16
請(qǐng)注意,到目前為止,我們一直在使用 verbosity 級(jí)別來(lái)更改顯示的文本。下面的示例改為使用 verbosity 級(jí)別來(lái)顯示更多文本:
import argparse parser = 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.y if args.verbosity >= 2: print("Running '{}'".format(__file__)) if args.verbosity >= 1: print("{}^{} == ".format(args.x, args.y), end="") print(answer)
結(jié)果:
$ python3 prog.py 4 2 16 $ python3 prog.py 4 2 -v 4^2 == 16 $ python3 prog.py 4 2 -vv Running 'prog.py' 4^2 == 16
沖突的選項(xiàng)
目前為止,我們一直使用 argparse.ArgumentParser 實(shí)例的兩個(gè)方法。讓我們引入第三個(gè):add_mutually_exclusive_group()。它允許我們指定相互沖突的選項(xiàng)。讓我們修改程序的其他部分,以便讓我們引入新功能變得更有意義:我們將引入 --quiet 選項(xiàng),它是 --verbose 的對(duì)立:
import argparse parser = 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.y if args.quiet: print(answer) elif args.verbose: print("{} to the power {} equals {}".format(args.x, args.y, answer)) else: print("{}^{} == {}".format(args.x, args.y, answer))
我們的程序更加簡(jiǎn)單了,為了演示我們丟掉了一些功能??傊?,下面是輸出結(jié)果:
$ python3 prog.py 4 2 4^2 == 16 $ python3 prog.py 4 2 -q 16 $ python3 prog.py 4 2 -v 4 to the power 2 equals 16 $ python3 prog.py 4 2 -vq usage: prog.py [-h] [-v | -q] x y prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose $ python3 prog.py 4 2 -v --quiet usage: prog.py [-h] [-v | -q] x y prog.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
那應(yīng)該很容易理解。在最后一個(gè)輸出里,我添加了長(zhǎng)選項(xiàng)與短選項(xiàng)的混合,這樣你能看到選項(xiàng)順序的靈活性。
在我們總結(jié)之前,你可能會(huì)想告訴用戶你程序主要用來(lái)做什么,以防他們不知道:
import argparse parser = 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.y if args.quiet: print(answer) elif args.verbose: print("{} to the power {} equals {}".format(args.x, args.y, answer)) else: print("{}^{} == {}".format(args.x, args.y, answer))
需要注意的是幫助信息有些許的變化。注意 [-v | -q] 是告訴我們可以使用任意一個(gè),但不能同時(shí)使用:
$ python3 prog.py --help usage: prog.py [-h] [-v | -q] x y calculate X to the power of Y positional arguments: x the base y the exponent optional arguments: -h, --help show this help message and exit -v, --verbose -q, --quiet
總結(jié)
argparse模塊提供的功能遠(yuǎn)遠(yuǎn)超出此處所示。它的文檔非常詳細(xì)和透徹,并有許多示例。相信你在閱讀完本次的 Python學(xué)習(xí)教程后,應(yīng)該輕松消化它們,而不會(huì)感到不知所措。更多的 Python學(xué)習(xí)教程也會(huì)繼續(xù)為大家更新,伙伴們有不清楚的地方,可以留言!
分享名稱:Python學(xué)習(xí)教程:Pythonargparse模塊
本文URL:http://aaarwkj.com/article6/gpjsog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、動(dòng)態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作、自適應(yīng)網(wǎng)站、網(wǎng)站排名、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)