前言:最近遇到了argparse模塊的使用,一開始的時候一臉懵逼,於是找了資料終於是明白了一點,記錄在下,如有錯誤,希望得到指正。
認識:
舉一個小例子,在命令行窗口輸入python,我們可以查詢到相關的python信息,但是如果我們想要進一步查看python的版本信息,那我們需要輸入 python --version ,在里 --version 被稱為可選參數,我們指定了 --version 這個參數,所以最后僅僅輸出python的版本信息。
在多個文件或者不同語言協同的項目中,python腳本經常需要從命令行直接讀取參數。這個時候argparse模塊就提供了極大地便利,比如說python腳本需要多個參數,並且每 個參數的類型不盡相同,這個時候我們就可以很方便的通過argparse模塊來進行設置傳遞不同的參數。
一般步驟:
1. 導入argparse模塊
使用 import argparse 來導入模塊
2. 創建ArgumentParser() 對象
parser = argparse.ArgumentParser()
parser為創建的新對象
3. 調用 add_argument() 方法添加參數
parser.add_argument()
在此函數可以對參數進行設置,比如說種類,默認值等等,下面我們會詳細探討
4. 使用 parse_args() 解析添加的參數
args = parser.parse_args()
args是一個namespace空間,解析的參數保存在里面
具體代碼舉例:
一般情況
將下面代碼保存為parser.py
import argparse parser = argparse.ArgumentParser() #分別增加兩個可選參數para1、para2,類型為int parser.add_argument('--para1', type=int, help='display an para1') parser.add_argument('--para2', type=int, help='display an para2') args = parser.parse_args() if args.para1: print(args.para1) else: print(args.para2)
運行的命令及結果:
#運行 python parser.py #結果 None #----------------------------------------------------- #運行 python parser.py -h #結果 usage: parser.py [-h] [--para1 PARA1] [--para2 PARA2] optional arguments: -h, --help show this help message and exit --para1 PARA1 display an para1 --para2 PARA2 display an para2 #----------------------------------------------------- #運行 python parser.py --para1 10 #結果 10 #----------------------------------------------------- #運行 python parser.py --para2 50 #結果 50 #----------------------------------------------------- #運行 python parser.py 10 #結果 usage: parser.py [-h] [--para1 PARA1] [--para2 PARA2] parser.py: error: unrecognized arguments: 10 #-----------------------------------------------------
----------------------------------------------------------------------------------------------------
第一個輸出None, 是因為我們並沒有傳入任何參數
----------------------------------------------------------------------------------------------------
第二個-h可以認為是自帶的可選參數,輸出我們增加的參數的所有信息
----------------------------------------------------------------------------------------------------
第三個我們輸入 --para1 10, 意思是我們將10這個參數作為鍵值傳入給para1存在args字典中
----------------------------------------------------------------------------------------------------
第四個我們輸入 --para2 50, 意思是我們將50這個參數作為鍵值傳入給para2存在args字典中
----------------------------------------------------------------------------------------------------
第五個輸出error,是因為我們只輸入了一個值,但是卻沒有指定這個值屬於哪個參數,因而出錯
----------------------------------------------------------------------------------------------------
必需參數
確保某些必需的參數有輸入,我們將增加para1參數的代碼改為如下所示
parser.add_argument('--para1', type=int, required=True, help='display an para1')
所得結果為:
usage: parser.py [-h] --para1 PARA1 [--para2 PARA2]
parser.py: error: the following arguments are required: --para1
位置參數:
位置參數沒有 -- 標簽,一般按照輸入的先后順序進行賦值,並且如果沒有賦值或者賦值數量不夠都會報錯
import argparse parser = argparse.ArgumentParser() parser.add_argument('para1', type=int, help='display an para1') parser.add_argument('para2', type=int, help='display an para2') args = parser.parse_args() print('para1 is %d'%(args.para1)) print('para2 is %d'%(args.para2))
運行為:
輸入: python parser.py 10 20 結果: para1 is 10 para2 is 20 -------------------------------------------------------- 輸入: python parser.py 10 結果: usage: parser.py [-h] para1 para2 parser.py: error: the following arguments are required: para2 --------------------------------------------------------
PS:可以使用nargs參數來限定輸入的位置參數的個數,默認為1。nargs參數也可用於普通帶標簽的參數。
此時多個參數值以list的形式作為鍵值
將para1參數改為
parser.add_argument('para1', type=int, nargs=2, help='display an para1') #print也要修改一下,因為上述打印方式不能打印list print(args.para1)
輸出:
輸入 python parser.py 10 20 30 輸出 [10, 20] para2 is 30
默認參數值
有時候我們對於不需要改動的參數不用每次都操作進行輸入,我們可以借助default這個參數,給予其默認值
將代碼改為如下並保存
import argparse parser = argparse.ArgumentParser() #此處如果是位置參數,則default參數不起作用 parser.add_argument('--para1', type = int ,default= 6 , help='display an para1') args = parser.parse_args() print(args.para1)
在命令行輸入: python parser.py
輸出: 6
選擇參數
這個參數值我認為很有用,將參數值的獲取限定在某個范圍內
編輯代碼:
import argparse parser = argparse.ArgumentParser() parser.add_argument('para1', type = int ,choices = [1,2,3,4,5], help='display an para1') args = parser.parse_args() print(args.para1)
如果輸入: python parser.py 6
輸出會出現error:
usage: parser.py [-h] {1,2,3,4,5}
parser.py: error: argument para1: invalid choice: 6 (choose from 1, 2, 3, 4, 5)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
疑問:關於default參數的使用,對於位置參數來說,使用default仿佛並沒有起到什么作用,如果不傳遞值得話還是會報錯
