Python解析命令行读取参数--argparse模块使用方法


Posted in Python onJanuary 23, 2018

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

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

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

在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

以下是其他网友的补充:

一、简介:

argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块。argparse模块的作用是用于解析命令行参数,例如python parseTest.py input.txt output.txt --user=name --port=8080。

二、使用步骤:

1:import argparse

2:parser = argparse.ArgumentParser()

3:parser.add_argument()

4:parser.parse_args()

解释:首先导入该模块;然后创建一个解析对象;然后向该对象中添加你要关注的命令行参数和选项,每一个add_argument方法对应一个你要关注的参数或选项;最后调用parse_args()方法进行解析;解析成功之后即可使用,下面简单说明一下步骤2和3。

三、方法ArgumentParser(prog=None, usage=None,description=None, epilog=None, parents=[],formatter_class=argparse.HelpFormatter, prefix_chars='-',fromfile_prefix_chars=None, argument_default=None,conflict_handler='error', add_help=True)

这些参数都有默认值,当调用parser.print_help()或者运行程序时由于参数不正确(此时python解释器其实也是调用了pring_help()方法)时,会打印这些描述信息,一般只需要传递description参数,如上。

四、方法add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

其中:

name or flags:命令行参数名或者选项,如上面的address或者-p,--port.其中命令行参数如果没给定,且没有设置defualt,则出错。但是如果是选项的话,则设置为None

nargs:命令行参数的个数,一般使用通配符表示,其中,'?'表示只用一个,'*'表示0到多个,'+'表示至少一个

default:默认值

type:参数的类型,默认是字符串string类型,还有float、int等类型

help:和ArgumentParser方法中的参数作用相似,出现的场合也一致

最常用的地方就是这些,其他的可以参考官方文档。下面给出一个例子,基本包括了常见的情形:

import argparse
 
def parse_args():
  description = usage: %prog [options] poetry-file
 
This is the Slow Poetry Server, blocking edition.
Run it like this:
 
 python slowpoetry.py <path-to-poetry-file>
 
If you are in the base directory of the twisted-intro package,
you could run it like this:
 
 python blocking-server/slowpoetry.py poetry/ecstasy.txt
 
to serve up John Donne's Ecstasy, which I know you want to do.
 
 
  parser = argparse.ArgumentParser(description = description)
   
  help = The addresses to connect.
  parser.add_argument('addresses',nargs = '*',help = help)
 
  help = The filename to operate on.Default is poetry/ecstasy.txt
  parser.add_argument('filename',help=help)
 
  help = The port to listen on. Default to a random available port.
  parser.add_argument('-p',--port', type=int, help=help)
 
  help = The interface to listen on. Default is localhost.
  parser.add_argument('--iface', help=help, default='localhost')
 
  help = The number of seconds between sending bytes.
  parser.add_argument('--delay', type=float, help=help, default=.7)
 
  help = The number of bytes to send at a time.
  parser.add_argument('--bytes', type=int, help=help, default=10)
 
  args = parser.parse_args();
  return args
 
if __name__ == '__main__':
  args = parse_args()
   
  for address in args.addresses:
    print 'The address is : %s .' % address
   
  print 'The filename is : %s .' % args.filename
  print 'The port is : %d.' % args.port
  print 'The interface is : %s.' % args.iface
  print 'The number of seconds between sending bytes : %f'% args.delay
  print 'The number of bytes to send at a time : %d.' % args.bytes</path-to-poetry-file>

运行该脚本:python test.py --port 10000 --delay 1.2 127.0.0.1 172.16.55.67 poetry/ecstasy.txt

输出为:

The address is : 127.0.0.1 .
The address is : 172.16.55.67 .
The filename is : poetry/ecstasy.txt .
The port is : 10000.
The interface is : localhost.
The number of seconds between sending bytes : 1.200000
The number of bytes to send at a time : 10.

Python 相关文章推荐
Python 字符串操作方法大全
Mar 11 Python
浅谈MySQL中的触发器
May 05 Python
python实现SMTP邮件发送功能
Jun 16 Python
Python 结巴分词实现关键词抽取分析
Oct 21 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
Nov 20 Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 Python
TensorFlow tf.nn.conv2d实现卷积的方式
Jan 03 Python
Python Tkinter Entry和Text的添加与使用详解
Mar 04 Python
Python装饰器用法与知识点小结
Mar 09 Python
Django实现将views.py中的数据传递到前端html页面,并展示
Mar 16 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 Python
pycharm代码删除恢复的方法
Jun 26 Python
Python 查看文件的读写权限方法
Jan 23 #Python
Python3 中文文件读写方法
Jan 23 #Python
Python3之文件读写操作的实例讲解
Jan 23 #Python
Python实现邮件的批量发送的示例代码
Jan 23 #Python
python实现自动发送邮件发送多人、群发、多附件的示例
Jan 23 #Python
python正则表达式面试题解答
Apr 28 #Python
Django中使用celery完成异步任务的示例代码
Jan 23 #Python
You might like
删除及到期域名的查看(抢域名必备哦)
2008/05/14 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
Php-Redis安装测试笔记
2015/03/05 PHP
PHP输入输出流学习笔记
2015/05/12 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
动态创建的表格单元格中的事件实现代码
2008/12/30 Javascript
jQuery prev ~ siblings选择器使用介绍
2013/08/09 Javascript
javascript:void(0)使用探讨
2013/08/27 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
JS实现超炫网页烟花动画效果的方法
2015/03/02 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
2016/04/01 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
react-native 圆弧拖动进度条实现的示例代码
2018/04/12 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
jQuery实现动态操作table行
2020/11/23 jQuery
Python 序列的方法总结
2016/10/18 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
Python发送邮件功能示例【使用QQ邮箱】
2018/12/04 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
HTML5新增加的功能详解
2016/09/05 HTML / CSS
国际书籍零售商:Wordery
2017/11/01 全球购物
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
Brydge英国:适用于Apple iPad和Microsoft Surface Pro的蓝牙键盘
2019/05/16 全球购物
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
九年级家长会邀请函
2014/01/15 职场文书
社区道德讲堂实施方案
2014/03/21 职场文书
经济国贸专业求职信
2014/06/18 职场文书
中学图书馆工作总结
2015/08/11 职场文书
2016关于军训的心得体会
2016/01/11 职场文书