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

 

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

posted @ 2024-08-17 17:44  垄山小站  阅读(133)  评论(0编辑  收藏  举报