Python技法:用argparse模块解析命令行选项
1. 用argparse模块解析命令行选项
我们在上一篇博客《Linux:可执行程序的Shell传参格式规范》中介绍了Linux系统Shell命令行下可执行程序应该遵守的传参规范(包括了各种选项及其参数)。Python命令行程序做为其中一种,其传参中也包括了位置参数(positional arguments)和可选参数(optional arguments):
(注意,可选参数的选项名称以--
或-
打头,位置参数和可选参数的先后顺序可以任意排布)
那么在Python程序中我们如何解析在命令行中提供的各种选项呢?(选项保存在sys.argv
中)我们可以使用argparse
模块。我们用下面这个search.py
程序做例子:
1.1 创建parser对象
首先我们需要创建parser
对象:
import argparse
parser = argparse.ArgumentParser(description="search some files")
1.2 添加选项声明
然后使用parser.add_argument()
方法添加想要支持的选项声明。add_argument()
的调用参数承担了不同的功能:
dest
指定了用来保存解析结果的属性名称。metavar
用于显示帮助信息,如果不指定则默认为大写的属性名。action
指定了与参数处理相关的行为(store
表示存储单个值,append
表示将多个值存到一个列表中)。
我们尝试依次添加如下选项声明进行测试:
解析位置参数
parser.add_argument(dest="filenames", metavar="filename", nargs="*")
该参数为位置参数,不需要像可选参数的选项一样用-
或--
打头。位置参数一般是必须要提供的(虽然这里你不提供也能保存为[]
)。nargs="*"
表示将所有额外命令行参数保存在一个列表中。
解析可选参数
parser.add_argument("-p", "--pat", metavar="pattern", required=True, dest="patterns", action="append", help="text pattern to search for")
-p
和--pat
两种选项名称都可接收(前者是简写,后者是全称)。我们在上一篇博客说过,在调用Shell命令时规定对于简写的选项名用-p ××
形式传参,对于全称的选项名我们有--pat ××
和--pat=××
两种形式。不过Python脚本时你用-p=××
也能解析,不过一般不建议这样搞。action="append"
意为允许命令行参数重复多次,将所有参数值保存在列表中,require=True
意味着参数必须要提供一次。
parser.add_argument("-v", dest="verbose", action="store_true", help="verbose mode")
store_true
意思为设定为一个布尔标记,标记的值取决于参数是否有提供。
parser.add_argument("-o", dest="outfile", action="store", help="output file")
类似上面,这里store
意思为接收一个单独的值并保存为字符串
parser.add_argument("--speed", dest="speed", action="store", choices={"slow", "fast"}, default="slow", help="search speed")
同上,该参数也是接受一个值,但只能在特定范围中{"slow", "fast"}
中选择,且默认"slow""
。
1.2 解析选项
然后我们就可以解析选项并使用传入的参数了:
args = parser.parse_args()
# 注意在使用参数时,是用的参数的dest名字
print(args.filenames)
print(args.patterns)
print(args.verbose)
print(args.outfile)
print(args.speed)
2. 测试
以上的程序定义了一个命令解析器,我们可以设置-h
选项查看其用法:
(base) orion-orion@MacBook-Pro Python-Lang % python search.py -h
usage: search.py [-h] -p pattern [-v] [-o OUTFILE] [--speed {slow,fast}] [filename ...]
search some files
positional arguments:
filename
optional arguments:
-h, --help show this help message and exit
-p pattern, --pat pattern
text pattern to search for
-v verbose mode
-o OUTFILE output file
--speed {slow,fast} search speed
接下来我们展示数据在程序中的显示方式。比如我们尝试不传入必需的-p/--pat
选项参数:
(base) orion-orion@MacBook-Pro Python-Lang % python search.py foo.txt bar.txt
usage: search.py [-h] -p pattern [-v] [-o OUTFILE] [--speed {slow,fast}] [filename ...]
search.py: error: the following arguments are required: -p/--pat
如上所示,解释器会提醒我们参数没传入。我们注意到usage
中-p pattern
并没有加方括号[]
,说明该参数不是可选的,必须要提供。
接下来我们提供完整参数,大家可以仔细观察print()
语句的输出:
(base) orion-orion@MacBook-Pro Python-Lang % python search.py -v -p spam --pat=eggs foo.txt bar.txt
['foo.txt', 'bar.txt']
['spam', 'eggs']
True
None
slow
可以看到如上所示,因为提供了参数-v
,故args.verbose
为True
。因为没提供-o ×××
参数,故args.outfile
为None
。
(base) orion-orion@MacBook-Pro Python-Lang % python search.py -v -p spam --pat=eggs foo.txt bar.txt -o results
['foo.txt', 'bar.txt']
['spam', 'eggs']
True
results
slow
可以看到如上所示,设置了提供了-o results
,故args.outfile
打印结果为results
。
(base) orion-orion@MacBook-Pro Python-Lang % python search.py -v -p spam --pat=eggs foo.txt bar.txt -o results --speed=fast
['foo.txt', 'bar.txt']
['spam', 'eggs']
True
results
fast
如上所示为提供了可选参数--speed
的情况。
3. 讨论
一旦选项给出后,我们只需要简单地执行parser.parse()
方法。这么做会处理sys.argv
的值,并返回结果实例。如果我们手动处理sys.argv
或者使用getopt
模块(仿照类似的C库打造),就会重复编写许多argparse
已经提供的代码,因此在新项目中应该优先选择argparse
。
参考
- [1] Martelli A, Ravenscroft A, Ascher D. Python cookbook[M]. " O'Reilly Media, Inc.", 2015.
- [2] https://docs.python.org/3/howto/argparse.html#id1
Python技法:用argparse模块解析命令行选项的更多相关文章
- python 解析命令行选项
问题: 程序如何能够解析命令行选项 解决方案 argparse 模块可被用来解析命令行选项 argparse 模块 argparse 模块是标准库中最大的模块之一,拥有大量的配置选项 dest 参数指 ...
- python模块----optparse模块、argparse模块 (命令行解析模块)
简介 optparse module---自版本3.2以来已弃用:optparse模块已弃用,将不再进一步开发:将继续使用argparse模块进行开发.optparse使用一种更具声明性的命令行解析方 ...
- optparse模块解析命令行参数的说明及优化
一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...
- python argparse模块解析命令行选项简单使用
argparse模块的解析命令行选项简单使用 util.py #!/usr/bin/env python # coding=utf-8 import argparse parser = argpars ...
- Python内置的一个用于命令项选项与参数解析的模块argparse
一.argparse简单使用 我们先来看一个简单示例.主要有三个步骤: 创建 ArgumentParser() 对象 调用 add_argument() 方法添加参数 使用 parse_args() ...
- python解析命令行参数
常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...
- python学习之argparse模块
python学习之argparse模块 一.简介: argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行 ...
- python学习之argparse模块的使用
以下内容主要来自:http://wiki.jikexueyuan.com/project/explore-python/Standard-Modules/argparse.html argparse ...
- 使用ACE_Get_Opt解析命令行
当我们用C++开发一些C++控制台小工具时,会需要一些用户输入的参数来决定程序如何工作和执行,而用户输入参数的方式大部分都是采用命令行参数的方式. 比如上一篇文章 玩转Windows服务系列--命令行 ...
随机推荐
- s函数中第一个程序修改(介绍function sys = mlupdate(t, x, u)用法)
示例: dx1/dt=-0.5572x1-0.7814x2+u1-u2; dx2/dt=0.7814x1+2u2; y=1.9691x1+6.4493x2; simulink模型的建立 s函数程序 A ...
- 推荐一些好用的 HTML5 & JavaScript 游戏引擎开发库
推荐一些好用的 HTML5 & JavaScript 游戏引擎开发库 0. 引言 如果你是一个游戏开发者,并且正在寻找一个可以与 JavaScript 和 HTML5 无缝工作的游戏引擎.那么 ...
- Java中JSONArray转换成int[]的办法
今天写项目的时候要做一个MyBatis的带IN子句的删除,于是用一个整型数组来保存待删除数据的ID 从前端将JSON字符串搞过来之后如何将JSONArray转换成int类型数组就成了个问题 下面是我的 ...
- 【零碎小bug系列】windows下的回车和换行符,cmd(telnet)上输出不左对齐
cmd(telnet)上输出不左对齐,而是有莫名其妙的空格 目录 cmd(telnet)上输出不左对齐,而是有莫名其妙的空格 背景 解决 细究 背景 在cmd上使用telnet连接本地端口的服务器时, ...
- pip——重新安装
原因 没有用管理员的权限安装.导致失败. 并且pip还被卸载了. 使用环境 win10 重新安装pip python -m ensurepip 更新pip 管理员打开cmd python -m pip ...
- Struts2-从值栈获取list集合数据(三种方式)
创建User封装数据类 public class User { private String username; private String password; public String getP ...
- 一些有用的工具,iftop,iotop,htop,glances
一些有用的工具: yum install glances -y资源监控工具GLANCESglances 可以为 Unix 和 Linux 性能专家提供监视和分析性能数据的功能,其中包括:CPU 使用率 ...
- 利用js获取不同页面间跳转需要传递的参数
获取参数的js函数如下: function GetQueryValue(queryName) { var query = decodeURI(window.location.search.substr ...
- Centos7 使用pm2快速安装创建定时任务
Centos7 安装 pm2 一丶拿到一个动态拨号的服务器还不用使用网络得先打开: pppoe-start 如果没有wget,需要先下载安装: yum install wget 二丶环境搭建 wget ...
- JavaScript基础第05天笔记
JavaScript基础第05天笔记 1 - 作用域 1.1 作用域概述 通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域.作用域的使用提 ...