使用 Windows、iOS、Android、HarmonyOS 等作業系統的裝置,使用者與這些裝置主要透過圖形使用者介面(GUI)來互動,比如:滑鼠、觸屏等。一般使用者很少使用這些系統的命令列介面(CLI),在 Windows 下是透過命令提示符(Cmd)視窗來實現 CLI 互動,其它系統透過終端 (Terminal) 視窗。
命令列介面 (CLI) 的起源始於最早的計算機終端,透過鍵盤輸入指令來執行操作。隨著 Unix 和 Linux 系統的流行,CLI 成為了程式設計師的首選互動方式。CLI 是軟體開發者、運維、資料分析師以及其他技術從業者日常依賴的工具。
命令列應用 (Command Line Application) 是一個執行在命令列介面環境下的應用程式。它可以接收使用者輸入的命令,執行特定的操作,並將結果輸出到命令列介面 。
1. Python 命令列應用
Python 命令列應用提供了豐富的功能和靈活性,使得開發者能夠高效地進行指令碼執行、模組匯入、包管理以及與其他系統的互動。Python 命令列介面類似於 UNIX shell,提供了額外的呼叫方法,如執行指令碼、模組或命令等。
Python 命令列應用的特點:
(1) 靈活性:Python 命令列應用可以在不同的作業系統和環境中使用,無需依賴特定的整合開發環境 (IDE) 或圖形介面,這使得它們具有很高的靈活性。
(2) 自動化:透過命令列執行 Python 指令碼,可以實現自動化任務,提高工作效率。
(3) 批次處理:命令列可以方便地批次處理資料,如批次重新命名、批次轉換格式等。
(4) 指令碼引數傳遞:透過命令列可以傳遞引數給 Python 指令碼,增加了指令碼的靈活性和可複用性。
(5) 除錯和測試:在命令列中執行 Python 指令碼可以更方便地進行除錯和測試,輸出除錯資訊、捕獲異常等,幫助開發人員快速定位和解決問題。
(6) 部署和整合:命令列執行 Python 指令碼可以方便地進行部署和整合,實現與其他系統的資料互動、呼叫其他程式等。
(7) 跨平臺性:Python 是一種跨平臺的程式語言,透過命令列執行 Python 指令碼可以在不同的作業系統上實現相同的功能,提高了程式碼的可移植性。
這些特點使得 Python 命令列應用在資料處理、系統管理、自動化任務等方面具有廣泛的應用價值。
2. 建立 Python 命令列應用
建立一個簡單的命令列應用程式通常需要以下步驟:
(1) 匯入系統模組以處理命令列引數;
(2) 使用主函式來處理命令列輸入;
(3) 根據輸入執行相應的操作;
(4) 列印輸出結果到控制檯;
示例, 建立一個 Python 指令碼檔案 cmd.py, 程式碼如下:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- import sys if __name__ == "__main__": print('Application:', sys.argv[0]) for i in range(1, len(sys.argv)): print('Parameter ' + str(i) + ': ', sys.argv[i])
執行:
$ python cmd.py param1 param2 param3 Application: cmd.py Parameter 1: param1 Parameter 2: param2 Parameter 3: param3
sys 模組是 Python 的內建模組,提供了對 Python 直譯器的訪問和控制。它可以用於處理命令列引數、重定向標準輸入輸出、終止程式的執行、處理異常、獲取系統相關資訊等。sys 模組中的 argv 變數是一個包含命令列引數的列表,其中第 1 個元素 (argv[0]) 是指令碼本身的名稱。
在 Python 中,main 是一個特殊的內建變數,用於指示當前模組是否作為主程式執行。如果當前模組被直接執行,if __name__ == '__main__' 後面的程式碼塊會被執行。如果模組被匯入到其他模組中,則不會執行 if __name__ == '__main__' 後面的程式碼塊。
3. argparse 模組
argparse 模組是 Python 的內建模組,用來解析命令列引數。argparse 解析 sys.argv(命令列)中的引數,自動生成幫助和使用訊息,並在使用者為程式提供無效引數時顯示錯誤提示。
使用 argparse 的主要步驟:
(1) 匯入 argparse 模組;
(2) 建立 ArgumentParser() 引數物件;
(3) 呼叫 add_argument() 方法往引數物件中新增引數;
(4) 使用 parse_args() 解析新增引數的引數物件,獲得解析物件;
示例, 建立一個 Python 指令碼檔案 cmd2.py, 程式碼如下:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- import argparse if __name__ == "__main__": parser = argparse.ArgumentParser(description='Test command line arguments') parser.add_argument('width', type=int, help='Width of a rectangle') parser.add_argument('height', type=int, help='Height of a rectangle') args = parser.parse_args() print(f'Rectangle: width = {args.width}, height = {args.height}')
執行:
$ python cmd2.py usage: cmd2.py [-h] width height cmd2.py: error: the following arguments are required: width, height $ python cmd2.py -h usage: cmd2.py [-h] width height Test command line arguments positional arguments: width Width of a rectangle height Height of a rectangle optional arguments: -h, --help show this help message and exit $ python cmd2.py 30 20 Rectangle: width = 30, height = 20
4. add_argument() 詳解
add_argument() 方法的引數格式:
add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
引數解釋如下:
name or flags - 選項字串的名字或者列表,例如 foo 或者 -f, --foo。
action - 命令列遇到引數時的動作,預設值是 store。
– store_const,表示賦值為 const;
– append,將遇到的值儲存成列表,也就是如果引數重複則會儲存多個值;
– append_const,將引數規範中定義的一個值儲存到一個列表;
– count,儲存遇到的次數;此外,也可以繼承 argparse.Action 自定義引數解析;
nargs - 應該讀取的命令列引數個數,可以是
具體的數字,或者是?號,當不指定值時對於 Positional argument 使用 default,對於 Optional argument 使用 const
或者是 * 號,表示 0 或多個引數;
或者是 + 號表示 1 或多個引數。
const - action 和 nargs 所需要的常量值。
default - 不指定引數時的預設值。
type - 命令列引數應該被轉換成的型別。預設是字串型別。
choices - 引數可允許的值的一個容器。
required - 可選引數是否可以省略 (僅針對可選引數)。
help - 引數的幫助資訊,當指定為 argparse.SUPPRESS 時表示不顯示該引數的幫助資訊.
metavar - 在 usage 說明中的引數名稱,對於必選引數預設就是引數名稱,對於可選引數預設是全大寫的引數名稱.
dest - 解析後的引數名稱,預設情況下,對於可選引數選取最長的名稱,中劃線轉換為下劃線.
1) 可選引數設定
示例,修改 cmd2.py 程式碼如下:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- import argparse if __name__ == "__main__": parser = argparse.ArgumentParser(description='Test command line arguments') parser.add_argument('--width', type=int, default=30, help='Width of a rectangle') parser.add_argument('--height', type=int, help='Height of a rectangle') args = parser.parse_args() print(f'Rectangle: width = {args.width}, height = {args.height}')
在引數名前加 --,設定為可選引數,如果未輸入,則使用 default 預設值(若未設定 default,則會預設賦值 None),執行如下:
$ python cmd2.py
Rectangle: width = 30, height = None
2) 可選引數引用名
示例,修改 cmd2.py 程式碼如下:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- import argparse if __name__ == "__main__": parser = argparse.ArgumentParser(description='Test command line arguments') parser.add_argument('-w', '--width', type=int, default=30, help='Width of a rectangle') parser.add_argument('-H', '--height', type=int, help='Height of a rectangle') args = parser.parse_args() print(f'Rectangle: width = {args.width}, height = {args.height}')
透過將可選引數設定引用名,可以縮短引數名,'-h' 已經被 argparse 模組預設使用了,這裡使用 '-H', 執行如下:
$ python cmd2.py -h usage: cmd2.py [-h] [-w WIDTH] [-H HEIGHT] Test command line arguments optional arguments: -h, --help show this help message and exit -w WIDTH, --width WIDTH Width of a rectangle -H HEIGHT, --height HEIGHT Height of a rectangle $ python cmd2.py -w 100 -H 50 Rectangle: width = 100, height = 50
3) 清除幫助中的引數名資訊
示例,修改 cmd2.py 程式碼如下:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- import argparse if __name__ == "__main__": parser = argparse.ArgumentParser(description='Test command line arguments') parser.add_argument('-w', '--width', type=int, default=30, metavar='', help='Width of a rectangle') parser.add_argument('-H', '--height', type=int, metavar='', help='Height of a rectangle') args = parser.parse_args() print(f'Rectangle: width = {args.width}, height = {args.height}')
執行如下:
$ python cmd2.py -h usage: cmd2.py [-h] [-w] [-H] Test command line arguments optional arguments: -h, --help show this help message and exit -w , --width Width of a rectangle -H , --height Height of a rectangle
4) 必選引數設定
示例,修改 cmd2.py 程式碼如下:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- import argparse if __name__ == "__main__": parser = argparse.ArgumentParser(description='Test command line arguments') parser.add_argument('-w', '--width', type=int, default=30, metavar='', required=True, help='Width of a rectangle') parser.add_argument('-H', '--height', type=int, metavar='', required=True, help='Height of a rectangle') args = parser.parse_args() print(f'Rectangle: width = {args.width}, height = {args.height}')
執行如下:
$ python cmd2.py -w 100
usage: cmd2.py [-h] -w -H
cmd2.py: error: the following arguments are required: -H/--height
5) 列表引數(多引數)傳入設定
示例,建立一個 Python 指令碼檔案 cmd3.py, 程式碼如下:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- import argparse if __name__ == "__main__": parser = argparse.ArgumentParser(description='Test command line arguments') parser.add_argument('-n', '--num', type=int, nargs='+', metavar='', required=True, help='a string of numbers') args = parser.parse_args() print(args.num)
執行如下:
$ python cmd3.py -n 1 2 3 4 5 6 7 8
[1, 2, 3, 4, 5, 6, 7, 8]
6) 互斥引數使用
示例,建立一個 Python 指令碼檔案 cmd4.py, 程式碼如下:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- import argparse if __name__ == "__main__": parser = argparse.ArgumentParser(description='Test command line arguments') group = parser.add_mutually_exclusive_group() # 新增互斥組 group.add_argument('-b', '--big', action='store_true', help='choose big') # 在互斥組中新增引數(store_true 預設當命令列未輸入引數則為 False,否則為 True) group.add_argument('-s', '--small', action='store_true', help='choose small') args = parser.parse_args() if args.big: print('Choose big') elif args.small: print('Choose small') else: print('Others')
執行如下:
$ python cmd4.py -b Choose big $ python cmd4.py -s Choose small $ python cmd4.py -b -s usage: cmd4.py [-h] [-b | -s] cmd4.py: error: argument -s/--small: not allowed with argument -b/--big
7) 預設引數設定
示例,建立一個 Python 指令碼檔案 cmd5.py, 程式碼如下:
#!/usr/bin/python3 # -*- coding: UTF-8 -*- import argparse if __name__ == "__main__": parser = argparse.ArgumentParser(description='Test command line arguments') parser.add_argument('-w', '--width', type=int, default=30, metavar='', required=True, help='Width of a rectangle') parser.set_defaults(height=20) args = parser.parse_args() print(f'Rectangle: width = {args.width}, height = {args.height}')
執行如下:
$ python cmd5.py -w 30
Rectangle: width = 30, height = 20