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

所属分类: 脚本专栏 / python 阅读数: 1802
收藏 0 赞 0 分享

在多个文件或者不同语言协同的项目中,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 3中的yield from语法详解

在python 3.3里,generator新增了一个语法 yield from,这个yield from的作用是什么?语法是什么呢?下面通过这篇文章主要给大家详细介绍了Python 3中yield from语法的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

python 开发的三种运行模式详细介绍

这篇文章主要介绍了python 开发的三种运行模式详细介绍的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

一步步教你用Python实现2048小游戏

相信2048这个游戏对大家来说一定不陌生,下面这篇文章就主要给大家介绍了怎么用Python实现2048小游戏,文中通过注释与示例代码介绍的很详细,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友们一起来看看吧。
收藏 0 赞 0 分享

Python爬取网易云音乐上评论火爆的歌曲

最近跟着网上教程学着用python爬取问题,于是就想试着扒一扒Python爬取网易云音乐上评论火爆的歌曲,下面这篇文章就主要介绍了利用Python如何爬取网易云音乐上那些评论火爆的歌曲,需要的朋友可以参考借鉴,一起来看看吧。
收藏 0 赞 0 分享

Python 3.x 连接数据库示例(pymysql 方式)

这篇文章主要介绍了Python 3.x 连接数据库示例(pymysql 方式),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

python解决汉字编码问题:Unicode Decode Error

最近在利用python读取一个含有汉字的文档时导致出现了乱码,并报出了两个错误,无奈只能上网找寻答案,后通过网友的帮助解决了这个问题,想着总结一下,下面这篇文章就主要介绍了python如何解决汉字编码问题,有需要的朋友们可以参考借鉴。
收藏 0 赞 0 分享

Python中二维列表如何获取子区域元素的组成

这篇文章主要给大家介绍了Python中二维列表是如何获取子区域元素的组成,文中给出了详细的介绍和示例代码,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友们下面来一起看看吧。
收藏 0 赞 0 分享

Python正则替换字符串函数re.sub用法示例

这篇文章主要介绍了Python正则替换字符串函数re.sub用法,结合实例形式分析了正则替换字符串函数re.sub的功能及简单使用方法,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

python中实现迭代器(iterator)的方法示例

我们经常需要遍历一个对象中的元素,在Python中这种功能是通过迭代器来实现的。下面这篇文章主要给大家介绍了python中实现迭代器(iterator)的方法示例,需要的朋友可以参考借鉴,下面来一起看看吧。
收藏 0 赞 0 分享

深入理解python对json的操作总结

Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式,本篇文章主要介绍了python对json的操作总结,具有一定的参考价值,有兴趣的可以了解一下。
收藏 0 赞 0 分享
查看更多