Python 命令行之旅:初探 argparse
Python 命令行之旅:初探 argparse
原文发表于Prodesire 博客。
前言
你是否好奇过在命令行中敲入一段命令后,它是如何被解析执行的?是否考虑过由自己实现一个命令行工具,帮你执行和处理任务?是否了解过陪伴在你身边的 Python 有着丰富的库,来帮你轻松打造命令行工具?
别着急,本文作为 Python 命令行之旅的第一篇将带你逐步揭开命令行解析的面纱,介绍如何使用 Python 内置的 argparse
标准库解析命令行,并在后续的系列文章中介绍各具特色的第三方命令行库,讲讲它们的异同,进而全面地体验这次探索的旅程。
本系列文章默认使用 Python 3 作为解释器进行讲解。 若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~
介绍
argparse
作为 Python 内置的标准库,提供了较为简单的方式来编写命令行接口。当你在程序中定义需要哪些参数,argparse
便会从 sys.argv
中获取命令行输入进行解析,对正确或非法输入做出响应,也可以自动生成帮助信息和使用说明。
快速开始
设置解析器
第一步要做的就是设置解析器,后续对命令行的解析就依赖于这个解析器,它能够将命令行字符串转换为 Python 对象。
通过实例化 argparse.ArgumentParser
,给定一些选填参数,我们就可以设置一个解析器:
import argparse parser = 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=<built-in function sum>, nums=[-1, 0, 1])
业务逻辑
解析好命令行后,我们就可以从解析结果中获取每个参数的值,进而根据自己的业务需求做进一步的处理。
比如,对于上文中所定义的 nums 参数,我们可以通过解析后的结果中的 accumulate
方法对其进行求最大值或求和(取决于是否提供 --sum
参数)。
result = args.accumulate(args.nums) print(result) # 基于上文的 ['--sum', '-1', '0', '1'] 参数,accumulate 为 sum 函数,其结果为 0
代码梳理
通过上文的讲解,完成一个命令行工具的步骤是不是挺简单易懂呢?我们将上文的代码汇总下,以有一个更清晰的认识:
# cmd.py import 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 1 0
若我们需要对一组数字求最大值,只需执行:
$ python3 cmd.py -1 0 1 1
如果给定的参数不是数字,则会报错提示:
$ python3 cmd.py a b c usage: 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 Program positional arguments: num a num for the accumulator optional arguments: -h, --help show this help message and exit --sum sum the nums (default: find the max)
小结
怎么样?揭开命令行工具的神秘面纱后,是不是发现它并没有想象中的困难?反倒是感受到一种简单而又强大的优雅呢?
不过这还远远不是 argparse
的全部面貌。对于一些复杂的情况,比如各种类型参数、参数前缀、参数组、互斥选项、嵌套解析、自定义帮助等等,我们都还没涉及探讨。
在下一篇文章中,让我们来一起深入了解 argparse
,感受它的魅力吧!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何用 Python 实现超级玛丽的界面和状态机?
云栖号:https://www.aliyun.com/#module-yedOfott8第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 小时候的经典游戏,代码参考了github上的项目Mario-Level-1(https://github.com/justinmeister/Mario-Level-1),使用pygame来实现,从中学习到了横版过关游戏实现中的一些处理方法。原项目实现了超级玛丽的第一个小关。在原项目的基础上,游戏使用json文件来保存每一个关卡的数据,将数据和代码解耦合,目前已开发4个小关,后续关卡的扩展也很方便,只需要添加json文件和地图图片,支持新的怪物就行。游戏还支持进入水管,到新的子地图。这篇文章是要介绍下游戏中的几个界面显示和界面之前如何转换,所以特意写了一个demo程序,完整的游戏代码在下面的github链接(https://github.com/marblexu/PythonSuperMario)中下载。 状态机介绍 游戏中的状态机一般都是有限状态机,简写为FSM(Finite State Mach...
- 下一篇
Python 命令行之旅:深入 argparse(一)
Python 命令行之旅:深入 argparse(一) 原文发表于 Prodesire 博客。 前言 在第一篇“初探 argparse”的文章中,我们初步掌握了使用 argparse 的四部曲,对它有了一个基本的体感。但是它具体支持哪些类型的参数?这些参数该如何配置?本文将带你深入了解 argparse 的参数们。 本系列文章默认使用 Python 3 作为解释器进行讲解。 若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~ 参数动作 你是否还记得?在上一篇四部曲中的第二步是定义参数,在这个步骤中,我们指定了 action 入参: parser.add_argument('--sum', dest='accumulate', action='store_const', const=sum, default=max, help='sum the nums (default: find the max)') 那么这里面的 action,也就是 参数动作,究竟是用来做什么的呢? 想象一下,当我们在命令行输入一串参数后,对于不同类型的参数是希望做不同的处理的。那么 参数动作 ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群