python中的argparse

argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块。argparse模块的作用是用于解析命令行参数。

最基础的,从一个最简单的程序开始:

import argparse
parser = argparse.ArgumentParser()

运行结果:

$ python 1.py
$ 

定位参数:

import argparse
parser=argparse.ArgumentParser()


parser.add_argument("echo")
parser.add_argument("hello")

args = parser.parse_args()

print args.ehco

运行:

$python 1.py
usage: 1.py [-h] echo hello
1.py: error: too few arguments

$python 1.py echo
usage: 1.py [-h] echo hello
1.py: error: too few arguments


$python 1.py echo hello
echo

 方法add_argument(),用来指定程序需要接受的命令参数;

并且argparse是默认字符串,如果以数字形式输入会报错,如下面代码所示:

1 import argparse
2 parser=argparse.ArgumentParser()
3 parser.add_argument("echo", help="echo the string you use here")
4 args=parser.parse_args()
5 print args.echo*10

运行:

$ python 1.py 4
Traceback (most recent call last):
  File "1.py", line 5, in <module>
    print args.square**2
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'

必须将代码增加type=你需要的类型(像这里需要int类型):

1 import argparse
2 parser=argparse.ArgumentParser()
3 parser.add_argument("echo", help="echo the string you use here", type=int)
4 args=parser.parse_args()
5 print args.echo*10

--help:

虽然现在帮助信息已经很美观了,但是还不够好。例如我们知道echo是个定位参数,但是却不知道该参数的意思,只能通过猜或者读源码。下面,我们可以让它更有帮助:

1 import argparse
2 parser = argparse.ArgumentParser()
3 parser.add_argument("echo", help="echo the string you use there")
4 args = parser.parser_args()
5 print args.echo

 运行:

1 $ python 1.py -h
2 usage: 1.py [-h] echo
3 
4 positional arguments:
5   echo        echo the string you use here
6 
7 optional arguments:
8   -h, --help  show this help message and exit

参考类型:

一般来说,如果不指定参数类型的话,argparse默认为字符串类型,可以通过type来指定;

1 import argparse
2 parser = argparse.ArgumentParser()
3 parser.add_argument("square", help="display a square of a given number", type=int)
4 args = parser.parse_args()
5 print args.square**2

 还可以使用default=xx来指定默认参数的值,例如:

1 parser.add_argument("echo", action="count", default=0)

可选参数:

1 import argparse
2 parser = argparse.ArgumentParser()
3 parser.add_argument("--verbosity", help="increase output verbosity")
4 args = parser.parse_args()
5 if args.verbosity:
6     print "verbosity turned on"

运行:

$ python 1.py --verbosity 1
verbosity turned on
$ python 1.py
$ python 1.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]

关于可选参数还有一个简写

1 import argparse
2 parser = argparse.ArgumentParser()
3 parser.add_argument("-vwww", "--verbose", help="increase output verbosity", action="store_true")
4 args = parser.parse_args()
5 if args.verbose:
6     print "verbosity turned on"

这里的-vww就是其简写,action: store_true / store_false:布尔开关。 store_true.默认为False,输入则为true。 store_flase 相反;

1 $ python prog.py -v
2 verbosity turned on
3 $ python prog.py --help
4 usage: prog.py [-h] [-v]
5 
6 optional arguments:
7   -h, --help     show this help message and exit
8   -v, --verbose  increase output verbosity

在命令行中只要-v和-vwww前面一致就行,如果是-vp就会报错;如果是-vw,默认是-vwww,也个23是正确的;

 注意:

1 parser.add_argument("-v", "--verbose", action="store_true",help="increase output verbosity")

这些是没有顺序的,当然也可以像上面一样了;

参数冲突:

迄今为止,我们已经使用到了[argparse.ArgumentParser][6]的两个方法,来看看他的另一个方法add_mutually_exclusive_group()。它可以让我们指定某个参数和其他参数冲突。下面来修改下程序以对这个新方法有更多的了解:我们将加入参数--quiet,它和参数--verbose冲突,不能同时指定:

 1 import argparse
 2 parser = argparse.ArgumentParser()
 3 parser.add_argument("-v", "--verbose", type=int, help="the base")
 4 parser.add_argument("-q", "--quiet", type=int, help="the exponent")
 5 
 6 args = parser.parse_args()
 7 if args.quiet:
 8     print "111111"
 9 elif args.verbose:
10     print "222222"

运行:

1 $python 1.py -v -q
2 $11111

 另一个方法add_mutually_exclusive_group():

1 import argparse
2 
3 parser = argparse.ArgumentParser()
4 group = parser.add_mutually_exclusive_group()
5 group.add_argument("-v", "--verbose", action="store_true")
6 group.add_argument("-q", "--quiet", action="store_true") 
7 if args.quiet:
8     print "111111"
9 elif args.verbose:
10     print "222222"

运行:

1 python 1.py -v -q
2 usage: 1.py [-h] [-v | -q]
3 test.py: error: argument -q/--quiet: not allowed with argument -v/--verbose

表明了可以使用-v或者-q,但是不能同时使用。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏pangguoming

angularJS constant和value

angularJS可以通过constant(name,value)和value(name,value)对于创建服务也是很重要的。 相同点是:都可以接受两个参数,...

2926
来自专栏C/C++基础

Protocol Buffers C++入门教程

protobuf(Protocol Buffers )是Google的开源项目,是Google的中立于语言、平台,可扩展的用于序列化结构化数据的解决方案。官网见...

711
来自专栏PHP实战技术

PHP操作Redis详解案例

$redis = new Redis(); connect, open 链接redis服务 参数 host: string,服务地址 port: int,端口号...

35212
来自专栏前端那些事

Express4.x API (一):application (译)

写在前面 Express文档核心的四大部分app,request,response,router,基本上已经完成。简单的总结 通过调用express()返回得到...

18710
来自专栏行者常至

(09)Struts2 请求的扩展名问题

361
来自专栏编码前线

Java动态代理

上面ClassA是委托类,ClassB是代理类,ClassB中的函数直接调用ClassA中相应的函数,并隐藏了ClassA的method3()函数。

964
来自专栏Spark学习技巧

Mapreduce shuffle详解

Mapreduce shuffle详解 Mapreduce确保每个reducer的的输入都是按键排序的。系统执行排序的过程(即将map输出作为输入 传给redu...

2793
来自专栏小灰灰

Nginx 路由转发配置笔记

Nginx 路由转发配置笔记 由于预算有限,只有一台服务器,想要玩的东西不少,所以这个台服务器上会提供多重服务,因此涉及到的nginx转发就必有重要了 由ng...

3586
来自专栏C/C++基础

C的全缓冲、行缓冲和无缓冲

基于流的操作最终会调用read或者write函数进行I/O操作。为了使程序的运行效率最高,流对象通常会提供缓冲区,以减少调用系统I/O库函数的次数。

462
来自专栏有趣的django

21天打造分布式爬虫-urllib库(一)

urlparse和urlsplit都是用来对url的各个组成部分进行分割的,唯一不同的是urlsplit没有"params"这个属性.

683

扫描关注云+社区