前言
python 有個非常實用的套件「argparse」,
使我們的程式執行時可以攜帶參數,
許多大型的 python 系統中都能夠看到使用這個套件的蹤影,
內文中也提供我自己的程式模板,
可以直接套用再更改成自己想要的樣子。
詳細說明
下面的範例程式碼中,是將每一個變數寫得較為嚴謹的,
實際上不需要每個都寫到這麼細節,但為了程式可讀性 (也方便其他工程師閱讀),
個人覺得是寫愈完整愈好。
import argparse
基本的「import argparse」是必要的,這個我就不多提了XD
argparse.ArgumentParser()
parser = argparse.ArgumentParser(prog='argparse_template.py', description='Tutorial')
這個是最一開始的宣告,內容可以不寫,
這些裡面的內容都是在當我們下「-h」、「–help」時才會出現的「提示內容」
也就是說,最少只需要寫 「parser = argparse.ArgumentParser()」,不能再少了
- prog=’argparse_template.py’
prog 指的是「程式的名稱」 - description=’Tutorial’
description 指的是「程式的功能敘述」
parser.add_argument()
parser.add_argument('--text', '-t', default='test123456', type=str, required=False, help='Text for program')
parser.add_argument('--nums', '-n', default='10', type=int, required=False, help='Text for program')
這邊就是「重點中的重點了」,
所有的參數都是在這邊完成的! 這邊提供兩個範例。
- ‘–text’, ‘-t’
(必給)就是指帶的參數,像這邊我們定義了「–text」、「-t」都可以,(長的是清楚、短的是方便),
這邊定義完之後,我們之後就可以透過這邊的內容在程式執行時下參數。
註:不一定要「兩個」,可以一個或兩個以上都沒問題,直接接在後面即可。
但一般建議「一長一短」就好 (目的:長的是清楚、短的是方便),太多看起來就太雜亂了。
- default=’10’
(可以不給)預設這個變數的值。 - type=str
(可以不給)預設這個變數的型態,通常是限制型態或讓可讀性更好,例如我們可以判斷 1 應該是 bool, str 還是 int。 - required=False
(可以不給)如果這個值是 True,在執行 python 的時候會強制要你給這個參數 (不管你有沒有設 default)。 - help=’Text for program’)
(可以不給)這個變數的說明,會在輸入錯誤時、或是輸入「-h」、「–help」時出現提示。
parser.parse_args()
將這些帶入的參數,導入至一個變數裡面。
習慣上我們都會直接寫
args = parser.parse_args()
呼叫變數
我們只要使用上面回傳的變數 args,
我們可以透過物件呼叫的方式將我們得到的變數呼叫出來。
例如: args.text、args.num (取決於:「你的 — 後面接的東西」)
寫完了,卻忘了自己設定怎麼使用嗎?
寫完了,卻忘了自己設定怎麼使用嗎?
argparse 也提供了我們方便的功能,
只要下 「-h」、「–help」就可以快速查詢所有的說明。
範例
範例程式碼 sample code
這邊我們將 argparse 做成一個 function,套用時
- 只需要修改 get_args() 就能直接修改要帶入的參數
- 修改 main() ,然後看你想要幹嘛XD
像這邊的 main() ,我們就將輸入的字串 args.text 重複印出 args.nums 次
import argparse
def get_args():
parser = argparse.ArgumentParser(prog='argparse_template.py', description='Tutorial')
parser.add_argument('--text', '-t', default='test', type=str, required=False, help='Text for repeated')
parser.add_argument('--nums', '-n', default='10', type=int, required=False, help='Repeated times')
return parser.parse_args()
def main():
for i in range(args.nums):
print(i, args.text)
if __name__ == '__main__':
args = get_args()
main()
範例執行結果
可以看到我們下了 「-n 10 (表示重複10次)」,「 -t (表示輸入字串)」
另外,因為我們有設定 default,所以就算有參數沒有下也能直接讀取 default 的值。
進階使用 – 設定不帶參數的純 flag (store_true)
上面的例子當中,我們幾乎示範的都是「帶有參數的」,例如「–num 10」,
其實也有不帶參數的用法,作為一個「單純的 flag」。
範例程式碼
在此,flag 作為單純的 flag 使用,
而「action=”store_true”」,表示「