【python 學習雜記】argparse模組使用教程
阿新 • • 發佈:2021-02-12
技術標籤:pythonpythonargparse命令列引數
argparse模組使用教程
1、argparse介紹
argparse
是一個用來解析命令列引數的 Python 庫,它是 Python 標準庫的一部分。基於 python 2.7 的 stdlib 程式碼。
argparse
模組使編寫使用者友好的命令列介面變得容易。程式定義了所需的引數,而argparse
將找出如何從sys.argv
(命令列)中解析這些引數。argparse
模組還會自動生成幫助和使用訊息,並在使用者為程式提供無效引數時發出錯誤。
2、未使用argparse示例
一般未使用到終端命令,對於一些需要變數賦值的程式,我們往往:
- 1、直接在程式中(或配置檔案)寫死。
- 2、或者利用input在命令列多次輸入
這樣不易多次除錯及修改執行,如下就是一個示例:
import math
def cal_vol(radius,height):
vol = math.pi * pow(radius,2) * height
return vol
if __name__=='__main__':
print(cal_vol(2,4))
3、使用argparse示例
2.1 argparse簡單示例
argparse使用主要有四個步驟:
- 匯入
argparse
包- 建立
ArgumentParser()
引數物件- 呼叫
add_argument()
方法往引數物件中新增引數- 使用
parse_args()
解析新增引數的引數物件,獲得解析物件- 程式其他部分,當需要使用命令列引數時,使用
解析物件.引數
獲取
如下是一個簡單的示例:
import math
import argparse # 1、匯入argpase包
def parse_args():
parse = argparse.ArgumentParser(description='Calculate cylinder volume') # 2、建立引數物件
parse.add_argument('radius', type=int, help='Radius of Cylinder') # 3、往引數物件新增引數
parse.add_argument('height', type=int, help='height of Cylinder')
args = parse.parse_args() # 4、解析引數物件獲得解析物件
return args
def cal_vol(radius, height):
vol = math.pi * pow(radius, 2) * height
return vol
if __name__ == '__main__':
args = parse_args()
print(cal_vol(args.radius, args.height)) # 5、使用解析物件.引數獲取使用命令列引數
注:此時因未指定,所以命令列引數輸入預設按順序賦值,順序不同會造成結果不同
預設命令-h可以獲取新增引數時設定的幫助資訊
2.2 argparse進階示例
add_argument() 方法(定義如何解析命令列引數):
引數解釋如下:
- name or flags - 選項字串的名字或者列表,例如 foo 或者 -f, --foo。
- action - 命令列遇到引數時的動作,預設值是 store。
- – store_const,表示賦值為const;
- – append,將遇到的值儲存成列表,也就是如果引數重複則會儲存多個值;
- – append_const,將引數規範中定義的一個值儲存到一個列表;
- – count,儲存遇到的次數;此外,也可以繼承 argparse.Action 自定義引數解析;
- nargs - 應該讀取的命令列引數個數,可以是
- 具體的數字,或者是?號,當不指定值時對於 Positional argument 使用 default,對於 Optional argument 使用 const
- 或者是 * 號,表示 0 或多個引數;
- 或者是 + 號表示 1 或多個引數。
- const - action 和 nargs 所需要的常量值。
- default - 不指定引數時的預設值。
- type - 命令列引數應該被轉換成的型別。
- choices - 引數可允許的值的一個容器。
- required - 可選引數是否可以省略 (僅針對可選引數)。
- help - 引數的幫助資訊,當指定為 argparse.SUPPRESS 時表示不顯示該引數的幫助資訊.
- metavar - 在 usage 說明中的引數名稱,對於必選引數預設就是引數名稱,對於可選引數預設是全大寫的引數名稱.
- dest - 解析後的引數名稱,預設情況下,對於可選引數選取最長的名稱,中劃線轉換為下劃線.
2.2.1 可選引數設定
import math
import argparse # 1、匯入argpase包
def parse_args():
parse = argparse.ArgumentParser(description='Calculate cylinder volume') # 2、建立引數物件
parse.add_argument('--radius', default=2, type=int, help='Radius of Cylinder') # 3、往引數物件新增引數
parse.add_argument('--height', default=4, type=int, help='height of Cylinder')
args = parse.parse_args() # 4、解析引數物件獲得解析物件
return args
def cal_vol(radius, height):
vol = math.pi * pow(radius, 2) * height
return vol
if __name__ == '__main__':
args = parse_args()
print(cal_vol(args.radius, args.height)) # 5、使用解析物件.引數獲取使用命令列引數
通過在引數名前加
--
,設定為可選引數,如果未輸入,則使用default
預設值(若未設定default
,則會預設賦值None
),如下示例:
2.2.2 可選引數引用名
import math
import argparse # 1、匯入argpase包
def parse_args():
parse = argparse.ArgumentParser(description='Calculate cylinder volume') # 2、建立引數物件
parse.add_argument('-r', '--radius', default=2, type=int, help='Radius of Cylinder') # 3、往引數物件新增引數
parse.add_argument('-H', '--height', default=4, type=int, help='height of Cylinder')
args = parse.parse_args() # 4、解析引數物件獲得解析物件
return args
def cal_vol(radius, height):
vol = math.pi * pow(radius, 2) * height
return vol
if __name__ == '__main__':
args = parse_args()
print(cal_vol(args.radius, args.height)) # 5、使用解析物件.引數獲取使用命令列引數
通過將可選引數設定引用名,可以縮短引數名,簡化命令列引數輸入:
如下:-r和–radius都可以
2.2.3 清除幫助中的引數名資訊
import math
import argparse # 1、匯入argpase包
def parse_args():
parse = argparse.ArgumentParser(description='Calculate cylinder volume') # 2、建立引數物件
parse.add_argument('-r', '--radius', default=2, type=int, metavar='', help='Radius of Cylinder') # 3、往引數物件新增引數
parse.add_argument('-H', '--height', default=4, type=int, metavar='', help='height of Cylinder')
args = parse.parse_args() # 4、解析引數物件獲得解析物件
return args
def cal_vol(radius, height):
vol = math.pi * pow(radius, 2) * height
return vol
if __name__ == '__main__':
args = parse_args()
print(cal_vol(args.radius, args.height)) # 5、使用解析物件.引數獲取使用命令列引數
如下,對比
2.2.2
中-h
顯示資訊,去掉了引數名
原因:
metavar
在通過-h
顯示 usage 說明中的引數名稱,對於必選引數預設就是引數名稱,對於可選引數預設是全大寫的引數名稱.。這裡通過設定為空一律不顯示。
2.2.4 必選引數設定
import math
import argparse # 1、匯入argpase包
def parse_args():
parse = argparse.ArgumentParser(description='Calculate cylinder volume') # 2、建立引數物件
parse.add_argument('-r', '--radius', default=2, type=int, metavar='', required=True, help='Radius of Cylinder') # 3、往引數物件新增引數
parse.add_argument('-H', '--height', default=4, type=int, metavar='', required=True, help='height of Cylinder')
args = parse.parse_args() # 4、解析引數物件獲得解析物件
return args
def cal_vol(radius, height):
vol = math.pi * pow(radius, 2) * height
return vol
if __name__ == '__main__':
args = parse_args()
print(cal_vol(args.radius, args.height)) # 5、使用解析物件.引數獲取使用命令列引數
當通過設定
required=True
後,無論引數是否是可選引數,都必須輸入,如下示例:
2.2.5 列表引數(多引數)傳入設定
import math
import argparse
def parse_args():
parse = argparse.ArgumentParser(description='Calculate cylinder volume')
parse.add_argument('-n', '--num', type=int, nargs='+', metavar='', required=True, help='a string of nums')
args = parse.parse_args()
return args
if __name__ == '__main__':
args = parse_args()
print(args.num)
for i in list(args.num):
print(i)
2.2.6 互斥引數使用
import math
import argparse
def parse_args():
parse = argparse.ArgumentParser(description='Calculate cylinder volume')
parse.add_argument('-r', '--radius', default=2, type=int, metavar='', required=True, help='Radius of Cylinder')
parse.add_argument('-H', '--height', default=4, type=int, metavar='', required=True, help='height of Cylinder')
group = parse.add_mutually_exclusive_group() # 1、在引數物件中新增互斥組
group.add_argument('-b', '--brief', action='store_true', help='print brief message') # 2、在互斥組中新增引數(store_true預設當命令列未輸入引數則為False,否則為True)
group.add_argument('-v', '--verbose', action='store_true', help='print verbose message')
args = parse.parse_args()
return args
def cal_vol(radius, height):
vol = math.pi * pow(radius, 2) * height
return vol
if __name__ == '__main__':
args = parse_args()
volume = cal_vol(args.radius, args.height)
if args.brief:
print(volume)
elif args.verbose:
print('Volume of Cylinder with radius %s and height %s is %s' % (args.radius,args.height,volume))
else:
print('Volume of Cylinder is %s' % (volume))
如下,命令列中b和v只能輸入二者中的一個引數:
2.2.7 預設引數設定
set_defaults()可以設定一些引數的預設值
import math
import argparse
def parse_args():
parse = argparse.ArgumentParser(description='Calculate cylinder volume')
parse.add_argument('-r', '--radius', default=2, type=int, metavar='', required=True, help='Radius of Cylinder')
parse.set_defaults(height=4)
args = parse.parse_args()
return args
def cal_vol(radius, height):
vol = math.pi * pow(radius, 2) * height
return vol
if __name__ == '__main__':
args = parse_args()
print(cal_vol(args.radius, args.height))
參考: