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 条评论
登录 后参与评论

相关文章

来自专栏hbbliyong

WebAPI返回数据类型解惑 以及怎样解决Extjs无法解析返回的xml

 最近开始使用WebAPI,上手很容易,然后有些疑惑   1.WebAPI默认返回什么数据类型,json还是xml?   2.怎么修改WebAPI的返回数据类型...

3288
来自专栏陈树义

Java并发编程:线程控制

在上一篇文章中(Java并发编程:线程的基本状态)我们介绍了线程状态的 5 种基本状态以及线程的声明周期。这篇文章将深入讲解Java如何对线程进行状态控制,比如...

4079
来自专栏杨建荣的学习笔记

shell基础学习总结(二) (r3笔记第72天)

-->关于shell编程之文件比较 可以使用如下的选项来做文件的比较。有了这些选项,文件的比较来说都是游刃有余。 -d file file是否存在...

2564
来自专栏Android中高级开发

Android并发编程 开篇

该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列。该系列引用了《Android开发艺术探索...

1012
来自专栏CaiRui

Bash Shell 小试牛刀

一、终端打印 [root@cai ~]# echo welcome to bash! welcome to bash! [cairui@cai ~]$ echo...

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

Linux命令(32)——grep命令

grep(Globally search a Regular Expression and Print)是GNU开发的一款免费开源的文本搜索工具。grep家族包...

1633
来自专栏北京马哥教育

Linux Bash脚本15分钟进阶教程

这里的技术技巧最初是来自谷歌的“Testing on the Toilet” (TOTT)。这里是一个修订和扩增版本。

740
来自专栏FreeBuf

Python黑客学习笔记:从HelloWorld到编写PoC(上)

本系列文章适合CS在读学生和万年工具党,本文会在英文原文的基础上做些修改,并适当增加些解释说明。 ? 本篇包含原文的前几部分: 0x0 – Getting St...

30510
来自专栏小灰灰

报警系统QuickAlarm之报警规则的设定与加载

前面一篇是报警执行器的定义与加载已经完成,但与之对应的报警规则有是如何定义和加载的呢? 此外,既然命名为规则,那么就需要有对应的解析器,以根据报警规则和报警类型...

37113
来自专栏游戏杂谈

Node.js文件编码格式的转换

项目很多 lua 文件不是 utf-8格式,使用 EditPlus 查看的时候,显示为ASCII。还有的是带BOM的,带BOM倒好处理,之前写过,有一定规律。

2064

扫码关注云+社区

领取腾讯云代金券