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 時可以用 typechoices 進行設定,此外還可以設定預設值,例如:

# -*- 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 。

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!