1. 程式人生 > 其它 >【python 學習雜記】argparse模組使用教程

【python 學習雜記】argparse模組使用教程

技術標籤: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))

在這裡插入圖片描述

參考: