Python解析命令行读取参数之argparse模块


Posted in Python onJuly 26, 2019

在多个文件或者不同语言协同的项目中,python脚本经常需要从命令行直接读取参数。万能的python就自带了argprase包 使得这一工作变得简单而规范。PS:optparse包是类似的功能,只不过写起来更麻烦一些。

如果脚本很简单或临时使用,没有多个复杂的参数选项,可以直接利用sys.argv将脚本后的参数依次读取(读进来的默认是字符串格式)。比如如下名为test.py的脚本:

import sys
print "Input argument is %s" %(sys.argv)

在shell脚本中运行python test.py help可以得到Input argument is help的结果。

1) 一般形式

但是大多数情况下,脚本很可能需要多个参数,而且每次参数的类型用处各不相同,那么这个时候在参数前添加标签表明参数的类型和用途便十分有用,而利用argparse模块可以很方便得实现这一目的。

同样用名为test.py的脚本举个栗子:

import argparse

parser = argparse.ArgumentParser(description="your script description")   # description参数可以用于插入描述脚本用途的信息,可以为空
parser.add_argument('--verbose', '-v', action='store_true', help='verbose mode') # 添加--verbose标签,标签别名可以为-v,这里action的意思是当读取的参数中出现--verbose/-v的时候
                     # 参数字典的verbose建对应的值为True,而help参数用于描述--verbose参数的用途或意义。
args = parser.parse_args()               # 将变量以标签-值的字典形式存入args字典
if args.verbose:
 print "Verbose mode on!"
else:
 print "Verbose mode off!"

运行python test.py后面跟了--verbose/-v的时候会输出前者,如果什么都没有会输出后者。如果输入了--verbose/-v以外的参数则会报错:unrecognized arguments

稍微提一下,action参数表示值赋予键的方式,这里用到的是bool类型;如果是'count'表示将--verbose标签出现的次数作为verbose的值;'append'表示将每次出现的该便签后的值都存入同一个数组再赋值。(嘛,一般后面两种用的比较少就不多说了)

PS:--help标签在使用argparse模块时会自动创建,因此一般情况不需要我们主动定义帮助信息。

$ python test.py --help
usage: test.py [-h] [--verbose]

your script description

optional arguments:
 -h, --help  show this help message and exit
 --verbose, -v  verbose mode

2) 必需参数

这种模式用于确保某些必需的参数有输入。

parser.add_argument('--verbose', required=True, type=int)

required标签就是说--verbose参数是必需的,并且类型为int,输入别的类型会报错。

3)位置参数(positional arguments)

位置参数与sys.argv调用比较像,参数没有显式的--xxx或者-xxx标签,因此调用属性也与sys.argv相同。

parser.add_argument('filename') # 输入的第一个参数赋予名为filename的键
args = parser.parse_args()
print "Read in %s" %(args.filename)

输入python test.py test.txt则会输出Read in test.txt

此外,可以用nargs参数来限定输入的位置参数的个数,默认为1。当然nargs参数也可用于普通带标签的参数。
parser.add_argument('num', nargs=2, type=int)表示脚本可以读入两个整数赋予num键(此时的值为2个整数的数组)。nargs还可以'*'用来表示如果有该位置参数输入的话,之后所有的输入都将作为该位置参数的值;‘+'表示读取至少1个该位置参数。'?'表示该位置参数要么没有,要么就只要一个。(PS:跟正则表达式的符号用途一致。)比如用:

parser.add_argument('filename')
parser.add_argument('num', nargs='*)

就可以运行python test.py text.txt 1 2

由于没有标签,所以用位置参数的时候需要比较小心。

4)输入类型

之前已经提到了用type参数就可以指定输入的参数类型。而这个type类型还可以表示文件操作的类型从而直接进行文件的读写操作。

parser.add_argument('file', type=argparser.FileType('r')) # 读取文件
args = parser.parse_args()
for line in args.file:
 print line.strip()

5)参数默认值

一般情况下会设置一些默认参数从而不需要每次输入某些不需要变动的参数,利用default参数即可实现。

parser.add_argument('filename', default='text.txt')

这个时候至直接运行python text.py就能得到Read in text.txt而不需要输入文件名了。

6)候选参数选择

表示该参数能接受的值只能来自某几个值候选值中,除此以外会报错,用choices参数即可。比如:

parser.add_argument('filename', choices=['test1.txt', 'text2.txt'])

参考:https://mkaz.tech/python-argparse-cookbook.html
https://docs.python.org/2/howto/argparse.html

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用Python3中的gettext模块翻译Python源码以支持多语言
Mar 31 Python
在Python中使用HTMLParser解析HTML的教程
Apr 29 Python
Python实现周期性抓取网页内容的方法
Nov 04 Python
python如何派生内置不可变类型并修改实例化行为
Mar 21 Python
对Python3中的print函数以及与python2的对比分析
May 02 Python
python3实现随机数
Jun 25 Python
详解Python:面向对象编程
Apr 10 Python
flask框架jinja2模板与模板继承实例分析
Aug 01 Python
Python调用C语言程序方法解析
Jul 07 Python
django表单中的按钮获取数据的实例分析
Jul 31 Python
python 算法题——快乐数的多种解法
May 27 Python
python多线程方法详解
Jan 18 Python
Django Rest framework三种分页方式详解
Jul 26 #Python
浅析Windows 嵌入python解释器的过程
Jul 26 #Python
python flask几分钟实现web服务的例子
Jul 26 #Python
解决python flask中config配置管理的问题
Jul 26 #Python
Django REST framework内置路由用法
Jul 26 #Python
python flask web服务实现更换默认端口和IP的方法
Jul 26 #Python
Django 开发环境与生产环境的区分详解
Jul 26 #Python
You might like
国内咖啡文化
2021/03/03 咖啡文化
php无限遍历文件夹示例分享
2014/03/04 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
javascript 常用代码技巧大收集
2009/02/25 Javascript
jquery 获取json数据实现代码
2009/04/27 Javascript
javascript 短路法代码精简
2009/08/20 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
javascript动态创建及删除元素的方法
2014/12/22 Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
2015/03/03 Javascript
ionic隐藏tabs的方法
2016/08/29 Javascript
Vue自定义指令介绍(2)
2016/12/08 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
Vuex实现数据增加和删除功能
2019/11/11 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
利用vue3+ts实现管理后台(增删改查)
2020/10/30 Javascript
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
python用户管理系统的实例讲解
2017/12/23 Python
python批量创建指定名称的文件夹
2019/03/21 Python
python使用minimax算法实现五子棋
2019/07/29 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
Keras自定义实现带masking的meanpooling层方式
2020/06/16 Python
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
通用C#笔试题附答案
2016/11/26 面试题
通信工程毕业生求职信
2013/11/16 职场文书
销售简历自我评价
2014/01/24 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
Java生成日期时间存入Mysql数据库的实现方法
2022/03/03 Java/Android
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫