我是靠谱客的博主 危机白云,最近开发中收集的这篇文章主要介绍Python命令行解析库argparse,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 简介
    • 概念
    • 基础
    • 位置参数介绍
    • 可选参数介绍
      • 短选项
    • 结合位置参数和可选参数
    • 冲突的参数
    • ArgumentParser 对象
    • add_argument() 方法
    • parse_args() 方法

简介

argparse模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后argparse将弄清如何从 sys.argv 解析出那些参数。 argparse模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。

argparse是Python标准库中推荐的命令行解析模块,无需安装可以直接使用。argparse是基于被弃用的optparse,因此用法与其非常相似。

还有另外两个模块可以完成同样的任务,称为getopt (对应于 C 语言中的 getopt() 函数) 和被弃用的optparse

概念

ls 命令可以很好的展示我们将要在这篇入门教程中探索的功能:

$ ls
cpython
devguide
prog.py
pypy
rm-unused-function.patch
$ ls pypy
ctypes_configure
demo
dotviewer
include
lib_pypy
lib-python ...
$ ls -l
total 20
drwxr-xr-x 19 wena wena 4096 Feb 18 18:51 cpython
drwxr-xr-x
4 wena wena 4096 Feb
8 12:04 devguide
-rwxr-xr-x
1 wena wena
535 Feb 19 00:05 prog.py
drwxr-xr-x 14 wena wena 4096 Feb
7 00:59 pypy
-rw-r--r--
1 wena wena
741 Feb 18 01:01 rm-unused-function.patch
$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
...

这四个命令中可以看到几个概念:

  • ls 是一个即使在运行的时候没有提供任何选项,也非常有用的命令。在默认情况下他会输出当前文件夹包含的文件和文件夹。

  • 如果我们想要使用比它默认提供的更多功能,我们需要告诉该命令更多信息。在这个例子里,我们想要查看一个不同的目录,pypy。我们所做的是指定所谓的位置参数。之所以这样命名,是因为程序应该如何处理该参数值,完全取决于它在命令行出现的位置。更能体现这个概念的命令如 cp,它最基本的用法是 cp SRC DEST。第一个位置参数指的是你想要复制的,第二个位置参数指的是你想要复制到的位置

  • 现在假设我们想要改变这个程序的行为。在我们的例子中,我们不仅仅只是输出每个文件的文件名,还输出了更多信息。在这个例子中,-l 被称为可选参数。

  • 这是一段帮助文档的文字。它是非常有用的,因为当你遇到一个你从未使用过的程序时,你可以通过阅读它的帮助文档来弄清楚它是如何运行的。

基础

从一个简单的例子开始:

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

运行结果如下:

$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h]
options:
-h, --help
show this help message and exit
$ python3 prog.py --verbose
usage: prog.py [-h]
prog.py: error: unrecognized arguments: --verbose
$ python3 prog.py foo
usage: prog.py [-h]
prog.py: error: unrecognized arguments: foo
  • 在没有任何选项的情况下运行脚本不会在标准输出显示任何内容。这没有什么用处。

  • 第二行代码开始展现出 argparse 模块的作用。我们几乎什么也没有做,但已经得到一条很好的帮助信息。

  • --help 选项,也可缩写为 -h,是唯一一个可以直接使用的选项(即不需要指定该选项的内容)。指定任何内容都会导致错误。即便如此,我们也能直接得到一条有用的用法信息。

位置参数介绍

举个例子:

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

运行结果:

$ python3 prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
$ python3 prog.py --help
usage: prog.py [-h] echo
positional arguments:
echo
options:
-h, --help
show this help message and exit
$ python3 prog.py foo
foo
  • add_argument() 方法用于指定程序能够接受哪些命令行选项。在这个例子中,我将选项命名为 echo,与其功能一致。

  • 现在调用我们的程序必须要指定一个选项。

  • parse_args()方法实际上从指定的选项返回一些数据,在本例中是echo

  • 不需要指定哪个变量是存储哪个值的,名称与传递给方法的字符串参数一致,都是 echo

然而请注意,尽管显示的帮助看起来清楚完整,但它可以比现在更有帮助。比如我们可以知道 echo 是一个位置参数,但我们除了靠猜或者看源代码,没法知道它是用来干什么的。所以,我们可以把它改造得更有用:

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

运行可以得到以下信息:

$ python3 prog.py -h
usage: prog.py [-h] echo
positional arguments:
echo
echo the string you use here
options:
-h, --help
show this help message and exit

接下来准备接受一个数字,计算它的平方:

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)

但是运行结果却报错了:

$ python3 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'

我们传递给它的选项视作为字符串,除非设置接收参数的类型:

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)

运行结果:

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

当收到错误的输入时,将提前退出,并且显示错误信息。

可选参数介绍

尝试添加可选参数

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

运行结果

$ python3 prog.py --verbosity 1
verbosity turned on
$ python3 prog.py
$ python3 prog.py --help
usage: prog.py [-h] [--verbosity VERBOSITY]
options:
-h, --help
show this help message and exit
--verbosity VERBOSITY
increase output verbosity
$ python3 prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument
  • 这一程序被设计为当指定 --verbosity 选项时显示某些东西,否则不显示。

  • 不添加这一选项时程序没有提示任何错误而退出,表明这一选项确实是可选的。注意,如果一个可选参数没有被使用时,相关变量被赋值为 None,在此例中是 args.verbosity,这也就是为什么它在 if 语句中被当作逻辑假。

  • 帮助信息更新。

  • 使用 --verbosity 选项时,必须指定一个值,但可以是任何值。

上述例子接受任何整数值作为 --verbosity 的参数,但对于我们的简单程序而言,只有两个值有实际意义:True 或者 False。让我们据此修改代码:

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")

输出

$ python3 prog.py --verbose
verbosity turned on
$ python3 prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
$ python3 prog.py --help
usage: prog.py [-h] [--verbose]
options:
-h, --help
show this help message and exit
--verbose
increase output verbosity
  • 现在,这一选项更多地是一个标志,而非需要接受一个值的什么东西。定义关键词 action赋值为 "store_true"。这表示当这一选项存在时,为 args.verbose 赋值为 True。没有指定时则隐含地赋值为 False

  • 当你为其指定一个值时,它会报错。

  • 帮助文档自动更新。

短选项

命令行中经常用到短选项,argparse可以很简单的定义短选项

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")

效果如下

$ python3 prog.py -v
verbosity turned on
$ python3 prog.py --help
usage: prog.py [-h] [-v]
options:
-h, --help
show this help message and exit
-v, --verbose
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", "--verbose", action="store_true",
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbose:
print(f"the square of {args.square} equals {answer}")
else:
print(answer)

输出如下

$ python3 prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
$ python3 prog.py 4
16
$ python3 prog.py 4 --verbose
the square of 4 equals 16
$ python3 prog.py --verbose 4
the square of 4 equals 16
  • 未输入位置参数,结果发生了报错。

  • 注意顺序无关紧要。

给程序加上接受多个冗长度的值,然后实际应用:

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(f"the square of {args.square} equals {answer}")
elif args.verbosity == 1:
print(f"{args.square}^2 == {answer}")
else:
print(answer)

输出

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

上面的-v参数不够严谨,我们可以指定choices来对可接收值的范围进行限制。

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, choices=[0, 1, 2],
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print(f"the square of {args.square} equals {answer}")
elif args.verbosity == 1:
print(f"{args.square}^2 == {answer}")
else:
print(answer)

输出

$ python3 prog.py 4 -v 3
usage: prog.py [-h] [-v {0,1,2}] square
prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
$ python3 prog.py 4 -h
usage: prog.py [-h] [-v {0,1,2}] square
positional arguments:
square
display a square of a given number
options:
-h, --help
show this help message and exit
-v {0,1,2}, --verbosity {0,1,2}
increase output verbosity

还可以将action指定为count来改变冗长度。这种方式更常见,也和 CPython 的可执行文件处理它自己的冗长度参数的方式一致(参考 python --help 的输出):

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(f"the square of {args.square} equals {answer}")
elif args.verbosity >= 1:
print(f"{args.square}^2 == {answer}")
else:
print(answer)print(answer)

输出

$ python3 prog.py 4 -v
4^2 == 16
$ python3 prog.py 4 -vv
the square of 4 equals 16
$ python3 prog.py 4 --verbosity --verbosity
the square of 4 equals 16
$ python3 prog.py 4 -v 1
usage: prog.py [-h] [-v] square
prog.py: error: unrecognized arguments: 1
$ python3 prog.py 4 -h
usage: prog.py [-h] [-v] square
positional arguments:
square
display a square of a given number
options:
-h, --help
show this help message and exit
-v, --verbosity
increase output verbosity
$ python3 prog.py 4 -vvvv
the square of 4 equals 16
$ python3 prog.py 4
Traceback (most recent call last):
File "prog.py", line 11, in <module>
if args.verbosity >= 2:
TypeError: '>=' not supported between instances of 'NoneType' and 'int'
  • 它也表现得与 “store_true” 的行为相似。

  • 如果你不添加 -v 标志,这一标志的值会是 None

  • 如期望的那样,添加该标志的长形态能够获得相同的输出。

  • 可惜的是,对于我们的脚本获得的新能力,我们的帮助输出并没有提供很多信息,但我们总是可以通过改善文档来修复这一问题(比如通过 help 关键字参数)。

  • 最后出现了一个问题,默认情况下可选参数没有被指定,它的默认值是None。

某些情况下需要给可选参数指定一个默认值,指定default=0

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", default=0,
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity >= 2:
print(f"the square of {args.square} equals {answer}")
elif args.verbosity >= 1:
print(f"{args.square}^2 == {answer}")
else:
print(answer)

输出

$ python3 prog.py 4
16

冲突的参数

argparse.ArgumentParser 实例中的 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))

输出

$ python3 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
options:
-h, --help
show this help message and exit
-v, --verbose
-q, --quiet

ArgumentParser 对象

class argparse.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, allow_abbrev=True, exit_on_error=True)

创建一个新的ArgumentParser对象。所有的参数都应当作为关键字参数传入。

  • prog - 程序的名字 (default: os.path.basename(sys.argv[0]))

  • usage - 描述程序用途的字符串(默认值:从添加到解析器的参数生成)

  • description - 在参数帮助文档之前显示的文本(默认值:无)

  • epilog - 在参数帮助文档之后显示的文本(默认值:无)

  • parents - 一个 ArgumentParser 对象的列表,它们的参数也应包含在内

  • formatter_class - 用于自定义帮助文档输出格式的类

  • prefix_chars - 可选参数的前缀字符集合(默认值: ‘-’)

  • fromfile_prefix_chars - 当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合(默认值: None

  • argument_default - 参数的全局默认值(默认值: None

  • conflict_handler - 解决冲突选项的策略(通常是不必要的)

  • add_help - 为解析器添加一个 -h/--help 选项(默认值: True

  • allow_abbrev - 如果缩写是无歧义的,则允许缩写长选项 (默认值:True

  • exit_on_error - 决定当错误发生时是否让 ArgumentParser 附带错误信息退出。 (默认值: True)

add_argument() 方法

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

定义单个的命令行参数应当如何解析。

  • name or flags - 一个命名或者一个选项字符串的列表,例如 foo-f, --foo

  • action - 当参数在命令行中出现时使用的动作基本类型。

  • nargs - 命令行参数应当消耗的数目。

  • const - 被一些 action 和 nargs 选择所需求的常数。

  • default - 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值。

  • type - 命令行参数应当被转换成的类型。

  • choices - 可用的参数的容器。

  • required - 此命令行选项是否可省略 (仅选项可用)。

  • help - 一个此选项作用的简单描述。

  • metavar - 在使用方法消息中使用的参数值示例。

  • dest - 被添加到 parse_args() 所返回对象上的属性名。

parse_args() 方法

ArgumentParser.parse_args(args=None, namespace=None)

将参数字符串转换为对象并将其设为命名空间的属性。 返回带有成员的命名空间。

  • args - 要解析的字符串列表。 默认值是从 sys.argv 获取。

  • namespace - 用于获取属性的对象。 默认值是一个新的空 Namespace 对象。

最后

以上就是危机白云为你收集整理的Python命令行解析库argparse的全部内容,希望文章能够帮你解决Python命令行解析库argparse所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部