python argparse_Python 命令行之旅——初探 argparse
『讲解开源项目系列』启动——让对开源项目感兴趣的人不再畏惧、让开源项目的发起者不再孤单。跟着我们的文章,你会发现编程的乐趣、使用和发现参与开源项目如此简单。欢迎联系我们给我们投稿,让更多人爱上开源、贡献开源~
前言
你是否好奇过在命令行中敲入一段命令后,它是如何被解析执行的?是否考虑过由自己实现一个命令行工具,帮你执行和处理任务?是否了解过陪伴在你身边的 Python 有着丰富的库,来帮你轻松打造命令行工具?
别着急,本文作为 Python 命令行之旅的第一篇将带你逐步揭开命令行解析的面纱,介绍如何使用 Python 内置的 argparse 标准库解析命令行,并在后续的系列文章中介绍各具特色的第三方命令行库,讲讲它们的异同,进而全面地体验这次探索的旅程。
本系列文章默认使用 Python 3 作为解释器进行讲解。若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~
介绍
argparse 作为 Python 内置的标准库,提供了较为简单的方式来编写命令行接口。当你在程序中定义需要哪些参数,argparse 便会从 sys.argv 中获取命令行输入进行解析,对正确或非法输入做出响应,也可以自动生成帮助信息和使用说明。
快速开始
设置解析器
第一步要做的就是设置解析器,后续对命令行的解析就依赖于这个解析器,它能够将命令行字符串转换为 Python 对象。通过实例化 argparse.ArgumentParser,给定一些选填参数,我们就可以设置一个解析器:
import argparseparser = argparse.ArgumentParser( description='My Cmd Line Program',)
定义参数
通过 ArgumentParser.add_argument 方法来为解析器设置参数信息,以告诉解析器命令行字符串中的哪些内容应解析为哪些类型的 Python 对象,如:
# 添加 nums 参数,在使用信息中显示为 num# 其类型为 int,且支持输入多个,且至少需要提供一个parser.add_argument('nums', metavar='num', type=int, nargs='+', help='a num for the accumulator')# 添加 --sum 参数,该参数被 parser 解析后所对应的属性名为 accumulate# 若不提供 --sum,默认值为 max 函数,否则为 sum 函数parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the nums (default: find the max)')
解析命令行
定义好参数后,就可以使用 ArgumenteParser.parse_args 方法来解析一组命令行参数字符串了。
默认情况下,参数取自 sys.argv[1:],它就是你在命令行敲入的一段命令(不含文件名)所对应的一个字符串列表。比如,若你输入 python3 cmd.py --sum 1 2 3,那么 sys.argsv[1:] 就是 ['--sum', '1', '2', '3']。
当然,也可以通过 parse_args 入参来指定一组命令行参数字符串:
args = parser.parse_args(['--sum', '-1', '0', '1'])print(args) # 结果:Namespace(accumulate=, nums=[-1, 0, 1])
业务逻辑解析
好命令行后,我们就可以从解析结果中获取每个参数的值,进而根据自己的业务需求做进一步的处理。比如,对于上文中所定义的 nums 参数,我们可以通过解析后的结果中的 `accumulate` 方法对其进行求最大值或求和(取决于是否提供 `--sum` 参数)。
result = args.accumulate(args.nums)print(result) # 基于上文的 ['--sum', '-1', '0', '1'] 参数,accumulate 为 sum 函数,其结果为 0
代码梳理
通过上文的讲解,完成一个命令行工具的步骤是不是挺简单易懂呢?我们将上文的代码汇总下,以有一个更清晰的认识:
# cmd.pyimport argparse# 1. 设置解析器parser = argparse.ArgumentParser( description='My Cmd Line Program',)# 2. 定义参数parser.add_argument('nums', metavar='num', type=int, nargs='+', help='a num for the accumulator')parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the nums (default: find the max)')# 3. 解析命令行args = parser.parse_args()# 4. 业务逻辑result = args.accumulate(args.nums)print(result)
若我们需要对一组数字求和,只需执行:
$ python3 cmd.py --sum -1 0 10
若我们需要对一组数字求最大值,只需执行:
$ python3 cmd.py -1 0 11
如果给定的参数不是数字,则会报错提示:
$ python3 cmd.py a b cusage: cmd.py [-h] [--sum] num [num ...]cmd.py: error: argument num: invalid int value: 'a'
我们还可以通过 -h 或 --help 参数查看其自动生成的使用说明和帮助:
usage: cmd.py [-h] [--sum] num [num ...]My Cmd Line Programpositional arguments: num a num for the accumulatoroptional arguments: -h, --help show this help message and exit --sum sum the nums (default: find the max)
小结
怎么样?揭开命令行工具的神秘面纱后,是不是发现它并没有想象中的困难?反倒是感受到一种简单而又强大的优雅呢?
不过这还远远不是 argparse 的全部面貌。对于一些复杂的情况,比如各种类型参数、参数前缀、参数组、互斥选项、嵌套解析、自定义帮助等等,我们都还没涉及探讨。
在下一篇文章中,让我们来一起深入了解 argparse,感受它的魅力吧!
欢迎关注 HelloGitHub 公众号,获取更多开源项目的资料和内容
python argparse_Python 命令行之旅——初探 argparse相关推荐
- python argparse_Python 命令行之旅:argparse、docopt、click 和 fire 总结篇
本文首发于HelloGitHub公众号,并发表于Prodesire 博客. 一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse.docopt.click 和 fire ...
- python argparse_Python 命令行之旅:初探 argparse
本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 你是否好奇过在命令行中敲入一段命令后,它是如何被解析执行的?是否考虑过由自己实现一个命令行工具,帮你执行和处理任 ...
- python argparse_Python 命令行之旅:深入 argparse(二)
本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 前言 在上一篇"深入 argparse(一)"的文章中,我们深入了解了 argparse 的包括参 ...
- python argvparser_Python命令行参数argv和argparse该如何使用
概述 运行python脚本时通过命令行方式传入运行参数通常有以下两种自建方式: sys.argv - 简洁 argparse - 丰富,可自定义 下面详细说一下具体时使用 argv # test_ar ...
- python3 命令行参数处理库 argparse、docopt、click、fire 简介
一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse.docopt.click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. 本文作 ...
- python 命令行参数-Python处理命令行参数
1. 将命令行参数保存在列表中,注意argv[0]是程序本身的名字: import sys print(sys.argv) print(sys.argv[1]) python argv.py loca ...
- python 命令-新手向——用python编写命令行应用的简洁方式
我们有一些方法可以做出Python的命令行式app.我试过它们,不过它们大都有自己的痛点和烦恼.所以我到社区里去寻找一种更好的方法. 什么是CLI? CLI 意味着命令行界面(command line ...
- python 命令-python解析命令行参数的三种方法详解
这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...
- python编写命令行框架_使用 Python 和 Click 编写命令行应用程序
简评:python 构建命令行应用的第三方比较有名的包除了 click 之外还有一个叫 docopt,这是一个以文档先行为目标的包.个人是比较倾向于 Click 的,看了这篇文章之后,也很快写了一个 ...
最新文章
- MyEclipse 中Access restriction 出现问题的解决
- sarscape 将dem文件转化成stl_STL源码剖析 阅读笔记(一)介绍
- 4 张动图解释为什么(什么时候)使用 Redux
- 红橙Darren视频笔记 view的invalidate调用draw方法的流程(源码分析基于api 29)
- SharePoint2010传入电子邮件
- mysql实训报告_MySQL实验报告
- cesium 加载bim模型_BIM+GIS跨界融合,打造智能未来新利器
- java版Spring Cloud+VR全景+直播短视频带货+三级分销+b2b2c多商家入驻前后端分离商城源码
- 账龄分析表excel模板_华为财务EXCEL内训手册(共131套模板,带公式).xls
- linux创建文件夹共享文件夹,Linux创建文件夹共享
- 【直播礼物特效】vapxtool简介(一)(企鹅电竞)
- HDOJ(航电)题目分类大全
- 基于物联网的多传感器远程温度监测系统
- 如何使用 FFMpeg 在 Node.js 中将音频从 Wav 转换为 MP3
- ARM发展史,初步汇总
- 超声波模块收发电路原理图
- python求幂_python矩阵求幂
- Atom 编辑器的语法导航
- 转:苹果CEO库克:伟大的想法来自不断拒绝接受现状
- swagger2搭配knife4j 隐藏实体类的属性/字段
热门文章
- google浏览器调试
- NOIP2014 写后感
- 【OJ2726】集合问题,堆
- bzoj1967 [AHOI2005]穿越磁场 离散最短路
- 2017.9.5 DZY Loves Math 失败总结
- 【Python】Python2.7.15 - Windows安装Python以及Python安装目录结构详解
- Intel 64/x86_64/IA-32/x86处理器 - 指令格式(7) - 80386/32位指令格式概述
- Intel® Nehalem/Westmere架构/微架构/流水线 (5) - 高速缓存 存储器子系统
- String源码解析
- native c++ 之javah