Python 命令行解析工具 Argparse

一、简介:

最近在写程序的时候,需要用到命令行解析工具。调研了几个工具之后,发现argparse 是 Python 中最好用的,它还是Python标准库中推荐使用的编写命令行程序的工具。在官网文档中找到了一篇 toturial ,简单记录一下学习过程。

二、基本认识

我们从一个最简单的例子开始:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument()
parser.parse_args()

首先,我们需要导入该模块,然后创建一个解析对象。之后向该对象中添加你要关注的命令行参数和选项,每一个 add_argument 方法对应一个你要关注的参数或选项;最后调用 parse_args() 方法进行解析;解析成功之后即可使用。

我们运行一下上面的程序(注意:把第三行注释掉),可以得到以下结果:

$ python prog.py
$ python prog.py --help
usage: prog.py [-h]

optional arguments:
  -h, --help  show this help message and exit
$ python prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo

结果分析:

  • 若不给参数而运行程序,那么将不会得到任何结果。
  • 第二条命令显示了使用 argparse 的好处,你什么也没做,却得到了一个很好的帮助信息。
  • 我们不需要自己手动设置 --help 参数,就能得到一个良好的帮助信息。但是,如果我们输入其他参数(比如 foo)就会产生一个错误。

三、位置参数

首先,我们给出一个例子:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print args.echo

运行结果:

$ python prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
$ python prog.py --help
usage: prog.py [-h] echo

positional arguments:
  echo

optional arguments:
  -h, --help  show this help message and exit
$ python prog.py foo
foo

结果分析:

  • 我们增加了一个 add_argument() 方法,用来设置程序可接受的命令行参数。
  • 现在如果我们要运行这个程序,就必须设置一个参数。
  • parse_args() 方法实际上从我们的命令行参数中返回了一些数据,在上面的例子中就是 echo
  • 这个神奇的过程,就是 argparse 自动完成的。

尽管自动产生的帮助信息展示地很美观,但是我们仍然无法只根据 echo 这个参数知道它是做什么的。所以,我们增加了一些东西,使得它变得更有用。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help = "echo the string you use here")
args = parser.parse_args()
print args.echo

运行结果:

$ python prog.py -h
usage: prog.py [-h] echo

positional arguments:
  echo        echo the string you use here

optional arguments:
  -h, --help  show this help message and exit

在此基础上,我们再多改变一点:(计算输入参数 square 的平方)

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number")
args = parser.parse_args()
print args.square**2

然后运行这个程序,我们得到如下结果:

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

这个程序并不能正确运行,因为 argparse 会将输入当作字符串处理,所以我们需要设置它的类型(type = int):

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

然后,我们再来运行这个程序,得到如下结果:

$ python prog.py 4
16
$ python prog.py four
usage: prog.py [-h] square
prog.py: error: argument square: invalid int value: 'four'

至此,我们已经学会了编写一个基础的命令行参数。

四、可选参数

第三节中,我们已经学会了位置参数。接下来,让我们来学习一下可选参数,如下:

import argparse
parser = argparse.ArgmentParser()
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

结果分析:

  • --verbosity 被修改时,这个程序就会输出一些东西,如果没有修改,那么不输出任何东西。
  • 从上面的结果我们发现,可选参数果然是可选的。因为我们不输入任何参数的时候,发现程序没有报错。因为在默认情况下,args.verbosity 输出的是 None,只有在给定参数的情况下,才会输出值。
  • help 信息也有一点改变。
  • 当我们使用 --version 选项,那么就一定要指定修改的值。

在上面这个例子中,我们可以指定任何的值给 --verbosity ,但是在我们的程序中,我们只需要知道 True 或者 False。OK,那就让我们来修改一下程序吧,如下:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
                    action="store_true")
args = parser.parse_args()
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

结果分析:

  • 我们在程序里面加了一个新的参数 action,并把它取值为 store_true 。也就是说如果这个选项 --verbose 被修改了,那么我们就给它赋值为 True,如果没有被修改,那么就是 False
  • 当你修改这个值的时候,实际上,不管你指定的是什么,它都会被赋值为 True

五、短参数

如果你熟悉命令行的使用,你会注意到我还没有谈到短参数的主题。 但是,这个很简单:

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 中进行了展示。

六、位置参数和可选参数联合使用

我们将位置参数和可选参数进行联合使用,构造出如下代码:

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

运行程序,输出结果为:

$ python prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
$ python prog.py 4
16
$ python prog.py 4 --verbose
the square of 4 equals 16
$ python prog.py --verbose 4
the square of 4 equals 16

结果分析:

  • 因为我们引入了一个位置参数,所以在命令行中我们必须导入这个参数,不然就会报错。
  • 位置参数和可选参数的前后位置是无关的。

那如果说,我们要在最开始就给变量进行一个赋值,那么该如何操作呢?别急,请看下面代码:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--square", type = int, default = 10, help = "display a square of a given number")
args = parser.parse_args()
print args.square * args.square

我们运行以上程序,得到如下结果:

$ python prog.py
100
$ python prog.py --square 12
144

结果分析:

我们添加了 default 属性,并且将它设置为 10 。也就是说,如果我们不去修改这个参数,那么程序就会按照 square = 10,来进行运行。如果我们修改这个值,那么就会按照修改的值进行运行。


Reference

Python 命令行解析工具 Argparse介绍(一)

Python 官网教程

转载于:https://my.oschina.net/u/3579120/blog/1533486

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值