Python系列(5)- 命令列應用 (Command Line Application)

垄山小站發表於2024-08-17

使用 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

相關文章