Python 指令行之旅:初探 argparse
原文發表于
Prodesire 部落格。
前言
你是否好奇過在指令行中敲入一段指令後,它是如何被解析執行的?是否考慮過由自己實作一個指令行工具,幫你執行和處理任務?是否了解過陪伴在你身邊的 Python 有着豐富的庫,來幫你輕松打造指令行工具?
别着急,本文作為 Python 指令行之旅的第一篇将帶你逐漸揭開指令行解析的面紗,介紹如何使用 Python 内置的
argparse
标準庫解析指令行,并在後續的系列文章中介紹各具特色的第三方指令行庫,講講它們的異同,進而全面地體驗這次探索的旅程。
本系列文章預設使用 Python 3 作為解釋器進行講解。
若你仍在使用 Python 2,請注意兩者之間文法和庫的使用差異哦~
介紹
argparse
作為 Python 内置的标準庫,提供了較為簡單的方式來編寫指令行接口。當你在程式中定義需要哪些參數,
argparse
便會從
sys.argv
中擷取指令行輸入進行解析,對正确或非法輸入做出響應,也可以自動生成幫助資訊和使用說明。
快速開始
設定解析器
第一步要做的就是設定解析器,後續對指令行的解析就依賴于這個解析器,它能夠将指令行字元串轉換為 Python 對象。
通過執行個體化
argparse.ArgumentParser
,給定一些選填參數,我們就可以設定一個解析器:
import argparse
parser = argparse.ArgumentParser(
description='My Cmd Line Program',
)
定義參數
通過
ArgumentParser.add_argument
方法來為解析器設定參數資訊,以告訴解析器指令行字元串中的哪些内容應解析為哪些類型的 Python 對象,如:
# 添加 nums 參數,在使用資訊中顯示為 num
# 其類型為 int,且支援輸入多個,且至少需要提供一個
parser.add_argument('nums', metavar='num', type=int, nargs='+',
help='a num for the accumulator')
# 添加 --sum 參數,該參數被 parser 解析後所對應的屬性名為 accumulate
# 若不提供 --sum,預設值為 max 函數,否則為 sum 函數
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the nums (default: find the max)')
解析指令行
定義好參數後,就可以使用
ArgumenteParser.parse_args
方法來解析一組指令行參數字元串了。
預設情況下,參數取自
sys.argv[1:]
,它就是你在指令行敲入的一段指令(不含檔案名)所對應的一個字元串清單。
比如,若你輸入
python3 cmd.py --sum 1 2 3
,那麼
sys.argsv[1:]
就是
['--sum', '1', '2', '3']
當然,也可以通過
parse_args
入參來指定一組指令行參數字元串:
args = parser.parse_args(['--sum', '-1', '0', '1'])
print(args) # 結果:Namespace(accumulate=<built-in function sum>, nums=[-1, 0, 1])
業務邏輯
解析好指令行後,我們就可以從解析結果中擷取每個參數的值,進而根據自己的業務需求做進一步的處理。
比如,對于上文中所定義的 nums 參數,我們可以通過解析後的結果中的
accumulate
方法對其進行求最大值或求和(取決于是否提供
--sum
參數)。
result = args.accumulate(args.nums)
print(result) # 基于上文的 ['--sum', '-1', '0', '1'] 參數,accumulate 為 sum 函數,其結果為 0
代碼梳理
通過上文的講解,完成一個指令行工具的步驟是不是挺簡單易懂呢?我們将上文的代碼彙總下,以有一個更清晰的認識:
# cmd.py
import argparse
# 1. 設定解析器
parser = argparse.ArgumentParser(
description='My Cmd Line Program',
)
# 2. 定義參數
parser.add_argument('nums', metavar='num', type=int, nargs='+',
help='a num for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the nums (default: find the max)')
# 3. 解析指令行
args = parser.parse_args()
# 4. 業務邏輯
result = args.accumulate(args.nums)
print(result)
若我們需要對一組數字求和,隻需執行:
$ python3 cmd.py --sum -1 0 1
0
若我們需要對一組數字求最大值,隻需執行:
$ python3 cmd.py -1 0 1
1
如果給定的參數不是數字,則會報錯提示:
$ python3 cmd.py a b c
usage: cmd.py [-h] [--sum] num [num ...]
cmd.py: error: argument num: invalid int value: 'a'
我們還可以通過
-h
或
--help
參數檢視其自動生成的使用說明和幫助:
usage: cmd.py [-h] [--sum] num [num ...]
My Cmd Line Program
positional arguments:
num a num for the accumulator
optional arguments:
-h, --help show this help message and exit
--sum sum the nums (default: find the max)
小結
怎麼樣?揭開指令行工具的神秘面紗後,是不是發現它并沒有想象中的困難?反倒是感受到一種簡單而又強大的優雅呢?
不過這還遠遠不是
argparse
的全部面貌。對于一些複雜的情況,比如各種類型參數、參數字首、參數組、互斥選項、嵌套解析、自定義幫助等等,我們都還沒涉及探讨。
在下一篇文章中,讓我們來一起深入了解
argparse
,感受它的魅力吧!