我是靠谱客的博主 可靠蜻蜓,最近开发中收集的这篇文章主要介绍Python 命令行解析工具 Argparse介绍(二),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今天学习python的argparse模块。看到了这样一篇文章,链接 http://www.cnblogs.com/jianboqi/archive/2013/01/10/2854726.html,题目是Python 命令行解析工具 Argparse介绍(一),翻译自python官网上的一篇 toturial,很基础,看完了找介绍(二),却在原作者那里没找到,于是就自己接着前辈的文章继续把这个totural翻译完了。


选项参数

现在让我们来看一下如何添加选项参数,例子如下。


import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
    print "verbosity turned on"

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

optional arguments:
  -h, --help            show this help message and exit
  --verbosity VERBOSITY
                        increase output verbosity
$ python prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py : error: argument --verbosity: expected one argument

结果分析:
1 这个程序在给出—verbosity选项值为1的时候输出 verbosity turned on,在没有verbosity选项的时候什么都没有输出。
2 再次提醒这是一个可选的选项,可以看到当你在没有提供这个选项的情况下运行,程序不会报错(这点和“介绍一”中必选不同)
3 可以看到帮助信息中有些不同,optional arguments:
4 如果你使用这个选项的话,则必须要给出具体值,例子中是 1 ,你可以给定任何值。

在以上的例子中,导致程序输出不同只有一个因素,就是args.verbosity的值是ture还是false。我们可以进行一点更改


import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
print type(args.verbose)#博主在这个地方加了一句输出type的代码,是因为由于上个例子里面给定的参数是1,很容易误解成布尔型变量,而实际上这个args.verbose是字符串,这也是为什么你输入任何参数值都会执行print "verbosity turned on”
if args.verbose:
   print "verbosity turned on”


输出:
$ python prog.py --verbose
verbosity turned on
$ python prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py : error: unrecognized arguments: 1
$ python prog.py --help
usage: prog.py [-h] [--verbose]

optional arguments:
  -h, --help  show this help message and exit
  --verbose   increase output verbosity

结果分析:
1 在目前这种情况下(参数只有true和false两个值起作用),参数与其说是输入一个值,到时更像做一个标记(flag)。你也许已经注意到了,在上面的程序中,我们增加了一个新的关键字,action,并且赋值store.verbose,它表明,当使用选项的时候,就表示true,不使用则为false,当然在选项后面也无需添加参数,否则将会报错。
2 注意help和刚刚有所不同,verbose后面没有参数。


参数缩写


如果你对命令行比较熟悉的话,对于参数的缩写形式肯定不会陌生。下面我们将为verbose添加缩写v。非常的简单。


import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print "verbosity turned on”


输出
$ python prog.py -v
verbosity turned on
$ python prog.py --help
usage: prog.py [-h] [-v]

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  increase output verbosity

注意help的输出,你只需要在其中同时添加 -v 就可以了。

位置参数和选项参数结合


现在我们将我们的程序变得复杂一些。


import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int,
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
    print "the square of {} equals {}".format(args.square, answer)
elif args.verbosity == 1:
    print "{}^2 == {}".format(args.square, answer)
else:
    print answer



输出
$ python prog.py 4
16
$ python prog.py 4 -v
usage: prog.py [-h] [-v VERBOSITY] square
prog.py : error: argument -v/--verbosity: expected one argument
$ python prog.py 4 -v 1
4^2 == 16
$ python prog.py 4 -v 2
the square of 4 equals 16
$ python prog.py 4 -v 3
16

简单介绍一下这个无聊的实例程序,可选参数v设置了输入为int型,然后分别输入参数,代表选择以不同的形式输出2的n次方。结果输出中却发现,除了1,2以外,所有其他参数值都是直接输出16(汗,你就这么写的怨谁)。所以,现在想把这个参数固定在0,1,2,就可以使用choice关键字,使用方法如下。


parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2],
                    help="increase output verbosity")



另外,可以这样改进一下事例程序。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2

# bugfix: replace == with >=
if args.verbosity >= 2:
    print "the square of {} equals {}".format(args.square, answer)
elif args.verbosity >= 1:
    print "{}^2 == {}".format(args.square, answer)
else:
    print answer


输出:

$ python prog.py 4 -vvv
the square of 4 equals 16
$ python prog.py 4 -vvvv
the square of 4 equals 16
$ python prog.py 4
Traceback (most recent call last):
  File " prog.py ", line 11, in <module>
    if args.verbosity >= 2:
TypeError: unorderable types: NoneType() >= int()

结果分析:
1 这个action非常好玩,赋值为count的时候变成了查这个v的个数来传递给args.verbosity。
2 注意一下这个错误,TypeError,当程序要求你输入一个必须参数,而你没有输入时,python会默认将这个参数赋值为None,None和int自然是不能比较的,于是引发了这个类型不匹配的错误。

最后,让我们来解决无参数时候程序崩溃的bug。根据你的编程经验,就该知道,default关键字出场了。给程序加入default关键字。
parser.add_argument("-v", "--verbosity", action="count", default=0,
                    help="increase output verbosity”)

输出:
$ python prog.py 4
16

冲突选项


下面介绍一下冲突选项的用法。使用方法add_mutually_exclusive_group()。

import argparse

parser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y

if args.quiet:
    print answer
elif args.verbose:
    print "{} to the power {} equals {}".format(args.x, args.y, answer)
else:
    print "{}^{} == {}".format(args.x, args.y, answer)



输出
$ python prog.py --help
usage: prog.py [-h] [-v | -q] x y

calculate X to the power of Y

positional arguments:
  x              the base
  y              the exponent

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose
  -q, —quiet

可以从help中看到,这两个选项是互斥的。

结束语


argparse模块的功能自然远远要比这个强大,这个教程仅仅是一个基础篇,能够让大家快速入手。具体的大量事例用法请查看https://docs.python.org/2/library/argparse.html#module-argparse




最后

以上就是可靠蜻蜓为你收集整理的Python 命令行解析工具 Argparse介绍(二)的全部内容,希望文章能够帮你解决Python 命令行解析工具 Argparse介绍(二)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部