Python使用sys.argv与argparse进行命令行参数处理 一、引言于开发进程里, 命令行参数处理属于高频需求, 小至快速编排出的测试脚本, 大至生产级别的命令行工具, 均需接纳外部传入的参数并予以解析。给出了多种处置命令行参数的方式, 当中sys.argv也就是sys模块所内置的, 与标准库这种方式, 是最为常见的两种。本文会结合具有实际操作意义的代码, 深入剖析两者的特性、差异以及适用的场景, 助力开发者挑选最为适宜的参数处理方案。二、原生的, 有着轻量性质的: 关于sys.argv的详细解析, 其中的2.1部分是sys.argv的基础认知。sys属于内置标准库, 并不需要进行额外安装, sys.argv是当中最为核心的命令行参数处理属性。2.一, 进行实战解析, 二, 是基于系统参数变量的命令行处理, 三, 文件格式为.py。以下是实战代码片段核心逻辑保留import os import sys # 遍历命令行参数从索引1开始跳过脚本名 for i in range(1, len(sys.argv)): if sys.argv[i] -h: # 手动编写帮助信息 print(本代码帮助 -h:用于查询帮助 -a:用于获取python所有关键字 -c:用于获取python安装的所有第三方库 -x:代表安装第三方库,加入镜像地址 -v:查询python的所有内置函数) if sys.argv[i] -a: print(开始查询Python的所有关键字) help(keywords) if sys.argv[i] -c: print(开始查询Python安装的所有第三方库 ) os.system(pip list) if sys.argv[i] -x: # 手动获取后续参数安装的库名 library_name sys.argv[i 1] print(f开始安装第三方库{library_name}) os.system(fpip install {library_name} -i https://mirrors.aliyun.com/pypi/simple/) if sys.argv[i] -v: print(开始查询python的所有内置函数) print(dir(__builtins__))代码执行示例执行 .py -hsys.argv的取值为.py, -h,程序在遍历抵达-h之后, 通过手动方式去打印帮助信息当执行.py -x时, sys.argv所呈现的状态是。程序手动取i1位置的作为库名执行安装。2.关于3 sys.argv的核心特点的第三个方面, 也就是功能强大, 下面来详细解说3.1的基础认知。存在这样一个情况, 它是3.2, 还有一个纳入标准库的命令行参数解析模块, 这个模块需要手动安装, 它是专门针对复杂命令行参数处理而设计的。3.2 实战解析基于 的命令行处理args.py以下是实战代码片段import argparse # 1. 创建参数解析器对象 ap argparse.ArgumentParser() # 2. 定义参数 # 布尔型参数--sum传入则执行求和函数 ap.add_argument(--sum, actionstore_true, help数字累加) # 数值型参数--aaa/--bbb默认值分别为30/36 ap.add_argument(--aaa, typeint, default30) ap.add_argument(--bbb, typeint, default36) # 3. 解析命令行参数 opt ap.parse_args() # 4. 业务逻辑处理 if opt.sum: a int(input()) b int(input()) print(a b) else: print(opt.aaa opt.bbb)代码执行示例执行args.py --sum, 程序触发情形为空, 此时进入手动输入求和逻辑, 执行args.py --aaa 10 --bbb 20, 程序会自动解析数值类型参数, 之后输出30, 执行args.py -h, 会自动生成标准化帮助信息。3.3, 核心特点四, 深度对比, sys.argv与, 0.1核心维度对比表, 对比维度, sys。原生性内置 sys 模块无需额外依赖3.2 标准库无需额外安装参数解析难度手动遍历 / 判断 / 切片难度高自动解析仅需定义参数难度低类型校验无需手动转换如 int/str支持 int/float 等类型自动校验默认值支持需手动判断参数是否存在再赋值内置 参数一键设置帮助信息生成需手动编写、打印帮助文本自动生成标准化 - h/--help 帮助信息异常容错无参数错误直接抛异常 / 逻辑错误内置异常处理自动输出错误提示代码量简单场景少几行即可处理多需定义解析器、参数、解析步骤代码量复杂场景极多需大量 if/else 处理参数少模块化定义参数逻辑清晰适用参数数量适合 1-3 个简单参数适合任意数量尤其多参数场景学习成本低仅需了解列表取值中需学习参数定义、 等属性4.2流程图sys.argv 解析流程手动处理解析流程自动处理4.3 性能对比实测数据为了去验证那两者之间的执行效率, 我们针对“解析1个参数并且输出结果”这个场景进行1000次循环测试, 测试环境是3.9.7以及11:方案1000 次执行总耗时ms单次平均耗时mssys.argv12.30.012318.70.0187结论是, sys.argv由于没有额外进行封装, 所以执行效率略微高一些, 又因为封装了解析逻辑, 因此耗时稍稍高一点, 不过差距处于毫秒这个级别, 对于业务场景来说是可以忽略不计的。五、筛选出适合sys.argv的应用场景, 这种场景包括: 进行极为简单的参数处置, 像只涉及一两个参数, 且不存在类型验证的情况迅速编写的临时性脚本, 此脚本追求代码极度简洁, 如果没有标准化需嵌入式或轻量化运行环境, 这类环境要求将依赖与代码量减到最少。其优先使用的场景为, 生产级命令行工具, 这要求具备标准化以及可维护性存在多参数、复杂参数逻辑, 像是包含类型校验、默认值、子命令等适用于团队协作开发, 此情形需要统一的参数解析规范和帮助信息要有容错性和用户友好性, 也就是自动错误提示、标准化帮助。六、总结。不是“谁替代谁”这种情况, 而是“按需选择”, sys.argv与之相关。在实际进行开发期间, 给出这样的建议, 即依据参数复杂度来作出选择, 若是属于简单场景, 就运用sys.argv从而能够快速达成实现, 要是处于复杂场景, 则运用并以此来提升代码质量以及用户体验。附: 要是有更轻量的第三方库的需要, 那么 Click 这个基于封装且语法更为简洁的库可以纳入考虑范围要是有兼容第二与第三版本的需要, 那就得留意相关版本的兼容性状况在第二版本时需通过手动 pip 来操作在生产环境当中, 哪怕使用系统参数向量, 增加参数校验以及异常处理来提升稳健性也是很有必要的。