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