使用 Python 解析引數

2019-07-24 21:04:00

使用 argparse 模組像專業人士一樣解析引數。

如果你在使用 Python 進行開發,你可能會在終端中使用命令,即使只是為了啟動 Python 指令碼或使用 pip 安裝 Python 模組。命令可能簡單而單一:

$ ls

命令也可能需要引數:

$ ls example

命令也可以有選項或標誌:

$ ls --color example

有時選項也有引數:

$ sudo firewall-cmd  --list-all --zone home

引數

POSIX shell 會自動將你輸入的內容作為命令分成陣列。例如,這是一個簡單的命令:

$ ls example

命令 ls 的位置是 $0,引數 example 位置是 $1

可以寫一個迴圈疊代每項。確定它是否是命令、選項還是引數。並據此採取行動。幸運的是,已經有一個名為 argparse 的模組。

argparse

argparse 模組很容易整合到 Python 程式中,並有多種便利功能。例如,如果你的使用者更改選項的順序或使用一個不帶引數的選項(稱為布林,意味著選項可以開啟或關閉設定),然後另一個需要引數(例如 --color red),argparse 可以處理多種情況。如果你的使用者忘記了所需的選項,那麼 argparse 模組可以提供友好的錯誤訊息。

要在應用中使用 argparse,首先要定義為使用者提供的選項。你可以接受幾種不同的引數,而語法一致又簡單。

這是一個簡單的例子:

#!/usr/bin/env pythonimport argparseimport sysdef getOptions(args=sys.argv[1:]):    parser = argparse.ArgumentParser(description="Parses command.")    parser.add_argument("-i", "--input", help="Your input file.")    parser.add_argument("-o", "--output", help="Your destination output file.")    parser.add_argument("-n", "--number", type=int, help="A number.")    parser.add_argument("-v", "--verbose",dest='verbose',action='store_true', help="Verbose mode.")    options = parser.parse_args(args)    return options

此範例程式碼建立一個名為 getOptions 的函數,並告訴 Python 檢視每個可能的引數,前面有一些可識別的字串(例如 --input 或者 -i)。 Python 找到的任何選項都將作為 options 物件從函數中返回(options 是一個任意名稱,且沒有特殊含義。它只是一個包含函數已解析的所有引數的摘要的資料物件)。

預設情況下,Python 將使用者給出的任何引數視為字串。如果需要提取整數(數位),則必須指定選項 type=int,如範例程式碼中的 --number 選項。

如果你有一個只是關閉和開啟功能的引數,那麼你必須使用 boolean 型別,就像範例程式碼中的 --verbose 標誌一樣。這種選項只儲存 TrueFalse,使用者用來指定是否使用標誌。如果使用該選項,那麼會啟用 stored_true

getOptions 函數執行時,你就可以使用 options 物件的內容,並讓程式根據使用者呼叫命令的方式做出決定。你可以使用測試列印語句檢視 options 的內容。將其新增到範例檔案的底部:

print(getOptions())

然後帶上引數執行程式碼:

$ python3 ./example.py -i foo -n 4Namespace(input='foo', number=4, output=None, verbose=False)

檢索值

範例程式碼中的 options 物件包含了使用者提供的選項後面的值(或派生的布林值)。例如,在範例程式碼中,可以通過 options.number 來檢索 --number

options = getOptions(sys.argv[1:])if options.verbose:    print("Verbose mode on")else:    print("Verbose mode off")print(options.input)print(options.output)print(options.number)# 這裡插入你的 Python 程式碼

範例中的布林選項 --verbose 是通過測試 options.verbose 是否為 True(意味著使用者使用了 --verbose 標誌)或 False(使用者沒有使用 --verbose 標誌),並採取相應的措施。

幫助和反饋

argparse 還包含一個內建的 --help(簡寫 -h)選項,它提供了有關如何使用命令的提示。這是從你的程式碼派生的,因此生成此幫助系統不需要額外的工作:

$ ./example.py --helpusage: example.py [-h] [-i INPUT] [-o OUTPUT] [-n NUMBER] [-v]Parses command.optional arguments:  -h, --help            show this help message and exit  -i INPUT, --input INPUT                        Your input file.  -o OUTPUT, --output OUTPUT                        Your destination output file.  -n NUMBER, --number NUMBER                        A number.  -v, --verbose         Verbose mode.

像專業人士一樣用 Python 解析

這是一個簡單的範例,來演示如何在 Python 應用中的解析引數以及如何快速有效地記錄它的語法。下次編寫 Python 指令碼時,請使用 argparse 為其提供一些選項。你以後會感到自得,你的命令不會像一個快速的臨時指令碼,更像是一個“真正的” Unix 命令!

以下是可用於測試的範例程式碼:

#!/usr/bin/env python3# GNU All-Permissive License# Copying and distribution of this file, with or without modification,# are permitted in any medium without royalty provided the copyright# notice and this notice are preserved.  This file is offered as-is,# without any warranty.import argparseimport sysdef getOptions(args=sys.argv[1:]):    parser = argparse.ArgumentParser(description="Parses command.")    parser.add_argument("-i", "--input", help="Your input file.")    parser.add_argument("-o", "--output", help="Your destination output file.")    parser.add_argument("-n", "--number", type=int, help="A number.")    parser.add_argument("-v", "--verbose",dest='verbose',action='store_true', help="Verbose mode.")    options = parser.parse_args(args)    return optionsoptions = getOptions(sys.argv[1:])if options.verbose:    print("Verbose mode on")else:    print("Verbose mode off")print(options.input)print(options.output)print(options.number)