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 相关文章推荐
python 正则表达式 概述及常用字符
May 04 Python
利用Python演示数型数据结构的教程
Apr 03 Python
用Python程序抓取网页的HTML信息的一个小实例
May 02 Python
Python Matplotlib库入门指南
May 18 Python
Python的time模块中的常用方法整理
Jun 18 Python
python实现斐波那契数列的方法示例
Jan 12 Python
PyQt5每天必学之工具提示功能
Apr 19 Python
django 修改server端口号的方法
May 14 Python
python障碍式期权定价公式
Jul 19 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
解决pycharm不能自动补全第三方库的函数和属性问题
Mar 12 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
Dec 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
选择PHP作为网站开发语言的原因分享
2012/01/03 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径
2014/06/30 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
php使用timthumb生成缩略图的方法
2016/01/22 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
2019/10/17 PHP
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
扩展easyui.datagrid,添加数据loading遮罩效果代码
2010/11/02 Javascript
select标记美化--JS式插件、后期加载
2013/04/01 Javascript
JS+CSS实现可拖拽的漂亮圆角特效弹出层完整实例
2015/02/13 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
微信小程序 向左滑动删除功能的实现
2017/03/10 Javascript
基于Vue插入视频的2种方法小结
2019/04/02 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
Vue实现腾讯云点播视频上传功能的实现代码
2020/08/17 Javascript
python时间整形转标准格式的示例分享
2014/02/14 Python
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
Python基础语言学习笔记总结(精华)
2017/11/14 Python
pandas系列之DataFrame 行列数据筛选实例
2018/04/12 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
Python Django框架实现应用添加logging日志操作示例
2019/05/17 Python
css3动画事件—webkitAnimationEnd与计时器time事件
2013/01/31 HTML / CSS
GLAMGLOW香港官网:明星出镜前的秘密武器
2017/03/16 全球购物
全球地下的服装和态度:Slam Jam
2018/02/04 全球购物
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
庆祝教师节活动方案
2014/01/31 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
质量月口号
2014/06/20 职场文书
先进工作者申报材料
2014/12/23 职场文书
2015年学校党建工作总结
2015/05/19 职场文书
总结Python使用过程中的bug
2021/06/18 Python
MySQL创建管理HASH分区
2022/04/13 MySQL