Python 命令列參數徹底解析|sys.argv 與 argparse 的使用方法

1. Python 命令列參數的基本用法

什麼是命令列參數?

在執行 Python 程式時,可以與執行指令一同提供額外資訊,這些額外資訊稱為「命令列參數」。透過這些參數,可以靈活改變程式的行為,或輕鬆地從外部傳遞資料。例如,可以將檔案名稱或設定值作為參數來傳遞,讓程式的內容動態變更。

使用 sys.argv 來獲取命令列參數

在 Python 中,可以使用標準函式庫 sys 模組來獲取命令列參數。sys.argv 是一個以列表形式存放命令列參數的變數。列表的第一個元素(sys.argv[0])是執行的腳本名稱,而第二個元素以後則是作為參數傳遞的值。

範例程式碼:簡單的計算程式

import sys

def main():
    if len(sys.argv) < 3:
        print("錯誤:需要提供兩個參數")
        return

    num1 = float(sys.argv[1])
    num2 = float(sys.argv[2])
    print(f"總和: {num1 + num2}")

if __name__ == "__main__":
    main()

上面的程式會計算從命令列傳遞的兩個數值的總和。執行範例如下:

$ python script.py 3 5
總和: 8.0

 

2. 使用 argparse 模組進行進階參數處理

argparse 的基本概念

雖然 sys.argv 可以用來獲取基本參數,但當參數數量變多,或者需要處理選項參數與標誌(如 --verbose)時,使用標準函式庫 argparse 會更方便。這個模組可以讓參數解析變得更簡單,並且自動生成錯誤訊息。

解析參數並建立解析器

使用 argparse 時,首先需要建立一個解析器,然後設定參數,最後解析命令列輸入的參數。

範例程式碼:基本的 argparse 使用方式

import argparse

def main():
    parser = argparse.ArgumentParser(description='這是一個範例程式')
    parser.add_argument('arg1', help='第一個參數')
    parser.add_argument('arg2', type=float, help='第二個數值參數')
    args = parser.parse_args()

    print(f"arg1 = {args.arg1}")
    print(f"arg2 = {args.arg2}")

if __name__ == "__main__":
    main()

這個程式會接收兩個參數,其中 arg1 為字串,arg2 為數值,解析後輸出結果。

$ python script.py test 5.5
arg1 = test
arg2 = 5.5

處理選項參數與標誌

argparse 的強大功能之一是可以處理選項參數與標誌。這讓我們可以根據是否提供特定參數來執行不同的程式邏輯,例如提供詳細輸出(如 --verbose 標誌)。

範例程式碼:使用選項參數與標誌

import argparse

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--verbose', action='store_true', help='顯示詳細輸出')
    parser.add_argument('numbers', nargs='+', type=float, help='數值列表')
    args = parser.parse_args()

    total = sum(args.numbers)
    if args.verbose:
        print(f"計算詳細資訊:{args.numbers} 的總和為 {total}")
    else:
        print(f"總和: {total}")

if __name__ == "__main__":
    main()

這個程式中,如果使用 --verbose 標誌,則會輸出更詳細的計算資訊;如果未指定,則只會顯示總和。

$ python script.py 1 2 3 --verbose
計算詳細資訊:[1.0, 2.0, 3.0] 的總和為 6.0

 

3. 錯誤處理與參數驗證

驗證參數數量與類型

處理命令列參數時,需要確保使用者輸入的參數數量與類型正確,否則程式可能會出錯。透過適當的驗證,可以提升程式的穩定性,避免不必要的錯誤。

範例程式碼:檢查參數數量與類型

import sys

def main():
    if len(sys.argv) != 3:
        print("錯誤:需要提供兩個參數")
        return

    try:
        num1 = float(sys.argv[1])
        num2 = float(sys.argv[2])
    except ValueError:
        print("錯誤:參數必須是數值")
        return

    print(f"總和: {num1 + num2}")

if __name__ == "__main__":
    main()

這個程式會檢查:

  • 輸入的參數數量是否正確(應該是兩個數值)。
  • 參數是否可以轉換為數值,若無法轉換則回傳錯誤訊息。

4. 實際應用與進階使用

建立命令列工具的應用範例

在實際應用中,命令列參數可以用來開發各種工具,例如處理文件或數據分析。以下是一個簡單的命令列工具範例,它可以計算指定文件的行數。

範例程式碼:計算文件行數的工具

import argparse

def main():
    parser = argparse.ArgumentParser(description='計算文件的行數')
    parser.add_argument('filename', help='要計算的文件名稱')
    args = parser.parse_args()

    try:
        with open(args.filename, 'r') as file:
            lines = file.readlines()
            print(f"文件 {args.filename} 的行數: {len(lines)}")
    except FileNotFoundError:
        print(f"錯誤:找不到文件 {args.filename}")

if __name__ == "__main__":
    main()

這個工具可以讀取指定文件,並計算其中的行數,執行範例如下:

$ python count_lines.py example.txt
文件 example.txt 的行數: 100
侍エンジニア塾

5. 總結

透過學習 Python 命令列參數的處理方法,可以讓程式具備更高的靈活性。從使用 sys.argv 來獲取簡單的參數,到使用 argparse 來處理複雜的命令列輸入,每種方法都有其適用的場景。選擇適合的方式,能讓程式更容易維護且更具擴展性。

此外,適當地加入錯誤處理與參數驗證,可以讓程式更加穩定,減少潛在的錯誤發生。命令列參數的應用範圍很廣,例如建立自動化腳本、開發命令列工具等,掌握這些技巧將能有效提升開發效率。

如果你對命令列參數的處理方式有更深入的需求,可以參閱官方文件或試著自己實作一些命令列工具來加深理解。