Python module - argparse
Posted on Dec 11, 2016 in Python 程式設計 - 初階 by Amo Chen ‐ 3 min read
一般開發程式不一定全然都得具備使用者介面(User Interface, UI),對於一些用途簡單的程式而言,使用命令列來運行即可,也能夠省去 UI 開發的成本。
開發命令列程式,經常會遇到的就是參數處理的問題,程式必須能夠靈活得取得所有參數,在 C 語言內有 getopt() 這個函數幫忙處理參數問題,同樣地,Python 2.7 之後也有 argparse 模組幫忙處理參數的取得(2.7 之前需用 getopt )。
以下為 Python 3 的 argparse 的使用範例。
第 1 個處理命令列的參數
greeting.py
# -*- coding: utf-8 -*-
import argparse
# 建立一個參數解析器,並為程式功能加上說明
parser = argparse.ArgumentParser(description='Say Hello')
# 增加一個想要的參數名稱 --name, 以及參數的使用說明
parser.add_argument('--name', help='What is your name?')
# 解析參數
args = parser.parse_args()
# 把參數 name 的值印出來
print('Hello', args.name)
執行 python3 greeting.py -h 結果如下:
$ python3 greeting.py -h
usage: greeting.py [-h] [--name NAME]
Say Hello
optional arguments:
-h, --help show this help message and exit
--name NAME What is your name?
從執行結果可以看到 argparse 模組很快地就做出簡單易懂的說明,省去重新設計的麻煩,讓開發者只要專注思考參數的相關設定與說明即可。
此外也可以注意到上述範例裡的參數是 optional arguments
,也就是說就算不帶任何參數程式也可以運作。接下來,我們試著改為必要參數。
必要參數
其實只要在 add_argument
method 中加入 required=True
就可以將參數變為必要。
# -*- coding: utf-8 -*-
import argparse
# 建立一個參數解析器,並為程式功能加上說明
parser = argparse.ArgumentParser(description='Say Hello')
# 增加一個必要的參數名稱 --name
parser.add_argument('--name', help='What is your name?', required=True)
# 解析參數
args = parser.parse_args()
# 把參數 name 的值印出來
print('Hello', args.name)
如此一來,只要執行程式時忘了帶必要參數就會顯示缺少的參數,也不必額外撰寫額外的檢查程式。
另一種必要參數的做法是利用 positional arguments ,不過 positional arguments 有次序上的要求,所以下指令時參數值放錯位置,就有可能讓程式出錯。
而 positional arguments 最大差別是不需要 -
或者 --
當作 prefix ,例如 --name
只要改成 name
就會變成 positional argument :
# -*- coding: utf-8 -*-
import argparse
# 建立一個參數解析器,並為程式功能加上說明
parser = argparse.ArgumentParser(description='Say Hello')
# 增加一個 positional argument - name, 以及參數的使用說明
parser.add_argument('name', help='What is your name?')
# 解析參數
args = parser.parse_args()
# 把參數 name 的值印出來
print('Hello', args.name)
執行 python3 greeting -h
時就會看到多一個 positional arguments
的區塊:
$ python3 greeting.py -h
usage: greeting.py [-h] name
Say Hello
positional arguments:
name What is your name?
optional arguments:
-h, --help show this help message and exit
檢查參數型態及合法參數項
argparse
模組也提供了參數型態轉換與合法參數項的檢查,分別是在 add_argument
時可以用 type
與 choices
進行設定,此外還可以設定預設值,例如:
# -*- coding: utf-8 -*-
import argparse
# 建立一個參數解析器,並為程式功能加上說明
parser = argparse.ArgumentParser(description='Say Hello')
# 增加一個只能是 M 或 F 的參數
parser.add_argument('gender', choices=['F', 'M'], help='Gender')
# 增加一個預設值是 1 的參數(解析完參數後會被轉成整數)
parser.add_argument('times', type=int, default=1, help='Loop times')
# 增加一個 positional argument - name, 以及參數的使用說明
parser.add_argument('name', help='What is your name?')
# 解析參數
args = parser.parse_args()
for _ in range(0, args.times):
if args.gender == 'M':
print('Hello, Mr.', args.name)
else:
print('Hello, Ms.', args.name)
這個範例相當實用,可以做為簡單的參數過濾機制,而且若參數選擇錯誤,argparse 也會顯示錯誤訊息 給使用者,省去不少檢查機制及錯誤處理的撰寫。
$ python3 greeting.py -h
usage: greeting.py [-h] {0,1} times name
Say Hello
positional arguments:
{0,1} Gender
times Loop times
name What is your name?
optional arguments:
-h, --help show this help message and exit
N args
還有一種參數不定長度的用法叫做 nargs
,例如算數字總和就可以交給 nargs
來幫忙。
# -*- coding: utf-8 -*-
import argparse
# 建立一個參數解析器,並為程式功能加上說明
parser = argparse.ArgumentParser(description='Sum')
parser.add_argument('N', type=int, nargs='+')
# 解析參數
args = parser.parse_args()
print(sum(args.N))
上述的範例 nargs
的值可以是 +
, ?
, *
或是任意數字,分別代表:
+ : 至少提供一個參數值
? : 可以 0 到 1 個參數值
* : 可以 0 到多個參數值
任意數字: 必須提供數字規定的參數個數
程式執行結果:
$ python3 do_sum.py 1 2 3 4
10
以上為幾種常用的 argparse 的用法,如果要詳細完整的說明,可以參閱 argparse 。