首頁 > 軟體

Python實現解析命令列引數的常見方法總結

2022-10-23 18:00:15

簡介

除ide的執行方式外,命令列的方式執行Python指令碼是引數化程式執行的一種常見且簡單的方法,正確處理命令列引數,可以提供給包含某種引數化資訊的程式或指令碼的引數。例如處理目錄或者檔案通常作為命令列引數傳遞給指令碼,用於使程式可以處理不同圖片或者不同型別檔案。

基本形式

python main.py -a v1 -b v2 ...

3種常見的獲取和解析命令列引數的方法

1、sys.argv

2、getopt

3、argparse

sys.argv案例

1、sys.argv返回一個列表,第一個值為指令碼名稱,列表的值型別為string。

2、引數數量:len(sys.argv)

3、獲取全部引數:sys.argv

案例原始碼1

# -*- coding: utf-8 -*-
# time: 2022/9/1 0:10
# file: args_demo.py
# 公眾號: 玩轉測試開發
import sys


def f1():
    print(f"正在執行的指令碼名稱: {sys.argv[0]}")
    print(f"指令碼的引數數量: {len(sys.argv)}")
    print(f"指令碼的引數: {sys.argv}")


if __name__ == '__main__':
    f1()

執行結果:

getopt案例:getopt 模組是專門處理命令列引數的模組,用於獲取命令列選項和引數。命令列選項使得程式的引數更加靈活,其支援短選項模式(-)和雙-選項模式(--)。該模組提供了兩個方法及一個例外處理來解析命令列引數。

語法格式:

getopt.getopt(args, options[, long_options])

引數說明:

args:要解析的命令列參數列,一般是sys.argv[1:],需要過濾掉指令碼名(sys.argv[0])

options:以字串的格式定義,options 後的冒號 “:” ,表示如果設定該選項,必須有附加的引數,否則就不附加引數

long_options:以列表的格式定義,long_options 後的等號 “=” ,表示該選項必須有附加的引數,不帶冒號表示該選項不附加引數

案例原始碼2

# -*- coding: utf-8 -*-
# time: 2022/9/1 0:10
# file: args_demo.py
# 公眾號: 玩轉測試開發
import sys
import getopt


def f1():
    print(f"正在執行的指令碼名稱: {sys.argv[0]}")
    print(f"指令碼的引數數量: {len(sys.argv)}")
    print(f"指令碼的引數: {sys.argv}")


def f2(argv):
    input_file = ""
    output_file = ""
    opts, args = getopt.getopt(argv[1:], "hi:o:", ["help", "input_file=", "output_file="])

    # "hi:o:": 短格式分析串, h 後面沒有冒號, 表示後面不帶引數; i 和 o 後面帶有冒號, 表示後面帶引數
    # ["help", "input_file=", "output_file="]: 長格式分析串列表, help後面沒有等號, 表示後面不帶引數; input_file和output_file後面帶冒號, 表示後面帶引數
    # 返回值包括 `opts` 和 `args`, opts 是以元組為元素的列表, 每個元組的形式為: (選項, 附加引數),如: ('-i', 'test.png');
    # args是個列表,其中的元素是那些不含'-'或'--'的引數

    for opt, arg in opts:
        if opt in ("-h", "--help"):
            # 即:處理 -h引數的案例說明,幫助檔案等
            print('args_demo.py -i <input_file> -o <output_file>')
            print('or: args_demo.py --input_file=<input_file> --output_file=<output_file>')
            sys.exit()
        elif opt in ("-i", "--input_file"):
            input_file = arg
        elif opt in ("-o", "--output_file"):
            output_file = arg
    print(f'輸入檔案為:{input_file}')
    print(f'輸出檔案為:{output_file}')

    # 列印不含'-'或'--'的引數
    for i in range(0, len(args)):
        print(f'不含 - 或 -- 的引數 {i + 1} 為:{args[i]}')


if __name__ == '__main__':
    # f1()
    f2(sys.argv)

命令列依次執行:

python args_demo.py -h
python args_demo.py -i a.txt
python args_demo.py -o b.txt
python args_demo.py -i a.txt  -o b.txt c.txt

執行結果:

Exception getopt.GetoptError:在參數列中沒有找到所傳遞引數,或選項的需要的引數為空時會觸發該異常。異常的引數是一個字串,表示錯誤的原因。屬性 msg 和 opt 為相關選項的錯誤資訊。在上述程式碼中新增例外處理,檢查此錯誤資訊。

使用錯誤的格式選項傳遞引數執行指令碼:python args_demo.py -q

argparse案例:當程式中使用採用複雜引數或多個檔名時,推薦使用 Python 的 argparse 庫,它以系統的方式處理命令列引數,從而可以編寫使用者友好的命令列程式。Python 標準庫 argparse 同樣也是用於解析命令列引數的模組。首先,由程式確定所需的引數,然後 argparse 將這些引數解析為 sys.argv。此外,argparse 會生成幫助和使用資訊提示,並在提供無效引數時發出錯誤。為了介紹此模組,編寫 argparse_demo1.py,如下所示:

為了介紹此模組,編寫 argparse_demo1.py,如下所示:

案例1

不帶引數執行此指令碼不會向 stdout 顯示任何內容。但是,如果使用 --help 或 -h 選項,將得到指令碼的使用資訊提示

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

執行結果:

(venv)>python argparse_demo.py -h
usage: argparse_demo.py [-h]

optional arguments:
  -h, --help  show this help message and exit

(venv)>python argparse_demo.py --help
usage: argparse_demo.py [-h]

optional arguments:
  -h, --help  show this help message and exit

案例2

指定其他引數會導致錯誤python argparse_demo.py -q

python argparse_demo.py -q
usage: argparse_demo.py [-h]
argparse_demo.py: error: unrecognized arguments: -q

案例3

新增一個引數需要呼叫方法 parser.add_argument

# -*- coding: utf-8 -*-
# time: 2022/8/31 16:20
# file: argparse_demo1.py
# author: tom
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("name", help="新增的第1個引數name,姓名。")
args = parser.parse_args()
print(f"args.name:{args.name}")
print(f"type:{type(args.name)}")

使用範例:

python argparse_demo1.py tom
python argparse_demo1.py -h
python argparse_demo1.py

執行結果:此時不帶引數執行指令碼則丟擲缺少引數name

(venv) >python argparse_demo.py tom
args.name:tom
type:<class 'str'>

(venv) >python argparse_demo.py -h
usage: argparse_demo.py [-h] name

positional arguments:
  name        新增的第1個引數name,姓名。

optional arguments:
  -h, --help  show this help message and exit

(venv) >python argparse_demo.py
usage: argparse_demo.py [-h] name
argparse_demo.py: error: the following arguments are required: name

使用--的形式:使用-的形式則--name改成 -name即可。

案例4

argparse 將提供的選項預設視為字串,新增int型別的案例

# -*- coding: utf-8 -*-
# time: 2022/8/31 16:20
# file: argparse_demo1.py
# author: tom
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--name", help="新增的第1個引數name,姓名。")
parser.add_argument("--age", help="新增的第2個引數age,年齡。", type=int)
args = parser.parse_args()
print(f"args.name:{args.name}")
print(f"type:{type(args.name)}")

print("*" * 50)

print(f"args.age:{args.age}")
print(f"type:{type(args.age)}")

使用範例:可使用兩種形式 --key=value  /  --key value

python argparse_demo.py --name=tom --age=30
python argparse_demo.py --name tom --age 30

執行結果:

(venv) >python argparse_demo.py --name=tom --age=30
args.name:tom
type:<class 'str'>
**************************************************
args.age:30
type:<class 'int'>

(venv) >python argparse_demo.py --name tom --age 30
args.name:tom
type:<class 'str'>
**************************************************
args.age:30
type:<class 'int'>

到此這篇關於Python實現解析命令列引數的常見方法總結的文章就介紹到這了,更多相關Python解析命令列引數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com