Python 命令列選項解析器


我們經常需要在從命令列執行 Python 指令碼時向其傳遞引數。但是,如果未提供所需數量、型別或順序的引數,指令碼會引發異常。這就是需要正確解析命令列引數的原因。

**argparse** 模組提供了編寫易於使用的命令列介面的工具。它處理如何解析從 sys.argv 列表中收集的引數,自動生成幫助資訊,並在給出無效選項時發出錯誤訊息。

設計命令列介面的第一步是設定解析器物件。這是透過 argparse 模組中的 **ArgumentParser()** 函式完成的。該函式可以將解釋性字串作為 description 引數。

首先,我們的指令碼將在沒有任何引數的情況下從命令列執行。仍然使用解析器物件的 **parse_args()** 方法,因為它沒有給出任何引數,所以什麼也不做。

import argparse
parser = argparse.ArgumentParser(description="sample argument parser")
args=parser.parse_args()

執行以上指令碼時

C:\python36>python argparser1.py
C:\python36>python argparser1.py --help
usage: argparser1.py [-h]
sample argument parser
optional arguments:
-h, --help show this help message and exit

第二個命令列用法給出了 –help 選項,它會生成如下所示的幫助訊息。–help 引數預設可用。

現在讓我們定義一個引數,該引數對於指令碼執行是必需的,如果沒有給出,指令碼應該丟擲錯誤。這裡我們透過 **add_argument()** 方法定義引數 ‘user’。

import argparse
parser=argparse.ArgumentParser(description="sample argument parser")
parser.add_argument("user")
args = parser.parse_args()
if args.user=="Admin":
print ("Hello Admin")
else:
print ("Hello Guest")

此指令碼的幫助資訊現在顯示了一個位置引數,形式為 ‘user’。程式檢查其值是否為 ‘Admin’,並列印相應的郵件。

C:\python36>python argparser1.py --help
usage: argparser1.py [-h] user
sample argument parser
positional arguments:
user
optional arguments:
-h, --help show this help message and exit
C:\python36>python argparser1.py Admin
Hello Admin
C:\python36>python argparser1.py temp
Hello Guest

我們可以在 add_argument() 方法中為引數賦值 **default** 值。

import argparse
parser=argparse.ArgumentParser(description="sample argument parser")
parser.add_argument("user", nargs='?',default="Admin")
args=parser.parse_args()
if args.user=="Admin":
print ("Hello Admin")
else:
print ("Hello Guest")

這裡 **nargs** 是應該使用的命令列引數的數量。'?'。如果可能,將從命令列使用一個引數,並將其作為一個專案生成。如果沒有命令列引數,則將生成 default 中的值。

C:\python36>python argparser1.py
Hello Admin
C:\python36>python argparser1.py Admin
Hello Admin
C:\python36>python argparser1.py test
Hello Guest

預設情況下,所有引數都被視為字串。要明確說明引數的 **type**,請在 add_argument() 方法中使用 type 引數。所有 Python 資料型別都是 type 的有效值。

import argparse
parser=argparse.ArgumentParser(description="add numbers")
parser.add_argument("first", type=int)
parser.add_argument("second", type=int)
args = parser.parse_args()
x = args.first
y = args.second
z = x+y
print ('addition of {} and {} = {}'.format(x,y,z))
C:\python36>python argparser2.py 2 3
addition of 2 and 3 = 5

在上面的示例中,引數是必需的。要新增可選引數,請在其名稱前加上雙破折號 --。在以下情況下,surname 引數是可選的,因為它前面帶有雙破折號 (--surname)

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
parser.add_argument("--surname")
args = parser.parse_args()
print ("My name is ", args.name, end=' ')
if args.surname:
print (args.surname)

以單破折號開頭的單個字母引數名稱充當短名稱選項。

C:\python36>python argparser3.py Malhar
My name is Malhar
C:\python36>python argparser3.py Malhar --surname Lathkar
My name is Malhar Lathkar
parser.add_argument("-s","--surname")

如果希望引數的值僅來自定義列表,則將其定義為 choices 引數。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("sub", choices=['Physics', 'Maths', 'Biology'])
args=parser.parse_args()
print ("My subject is ", args.sub)

請注意,如果引數的值不在列表中,則會顯示無效選擇的錯誤。

C:\python36>python argparser4.py Physics
My subject is Physics
C:\python36>python argparser4.py English
usage: argparser4.py [-h] {Physics,Maths,Biology}
argparser4.py: error: argument sub: invalid choice: 'English' (choose from 'Physics', 'Maths', 'Biology')

更新於:2020年6月26日

915 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告