項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 search-input 尚未註冊或是沒有一個 view.php 檔案.

【Python 系統相關 #2】python 利用 argparse 使程式執行時可帶參數 (updated: 2022/12/19)

前言

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”」,表示「