文章目录
一、argparse简介
此模块主要为了建立如Linux命令行般的命令结构。argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数。
二、命令行语法格式介绍
在写命令行之前我们先介绍一下什么是命令行,命令行的结构是怎么样的。我们以在Linux系统上的git命令为例作为介绍。
- 基本命令行形式
命令 <必选参数1|必选参数2> [-option {必选参数1|必选参数2|必选参数3}] [可选参数...]
- 命令示例如下:
git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
- 下图中git命令行帮助
在命令行参数中,常见有以下符号:
{}、[]、<>、()、|、…
2.1 大括号{ }
大括号{}
,必选参数,内部使用,包含此处允许使用的参数。代码写法参见互斥。
crontab [ -u user ] { -l | -r | -e }
上述参数中-l
、-r
、-e
任选其一,而且这三个选项是互斥的,不能同时使用。
2.2 方括号[ ]
方括号[ ]
表示其中的元素(参数、值或信息)是可选的。可以选择一个或多个条目,也可以不选。
ls [-alrtAFR] [name]
ls语法,表示后面的两个参数为可选参数。-alrtAFR
中任意数量任意组合都可以同时使用。
常见的使用如下:
$ ls
$ ls -a
$ ls -l data
2.3 尖括号< >
尖括号<>
表示其中的元素(参数、值或信息)是必需的。需要用相应的参数来替换尖括号里面的文本。
示例:
f <file name>,-printer <printer name>, -repeat <months> <days> <hours> <minutes> , date access <mm/dd/yyyy>
2.4 管道 |
管道符号(坚线)含义是“或者”,用于分割多个互斥的参数,使用时只能选择一个。如果两个参数由管道符号分隔开,可以选择分隔符左边的元素,也可选择分隔符右边的元素。在方括号中,这些选项是可选的。在尖括号中,至少需要一个选项。在大括号中可选或者只能选一个。
示例:
crontab [ -u user ] { -l | -r | -e }
管道符|
表示|
两边的参数任选其一。
2.5 省略号 …
由三个句点···组成的省略号含义是“等等”,表示前述元素(参数、值或信息) 可以在命令行中多次重复出现。
示例:
jobid <job id1, job id2, job id3,...> 、[-exitcode <exit code 1>、<exit code2><exit code3> ...]
2.6 小括号 ( )
小括号()
,用于指明参数的默认值,只用于{}
中。
2.7 子命令
在Linux中许多程序都会将其功能拆分为一系列子命令,例如,git 程序可发起调用的子命令有 git add, git clone 和 git init 等。
示例:
pi@raspberrypi:~ $ git --help
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]
These are common Git commands used in various situations:
start a working area (see also: git help tutorial)
clone Clone a repository into a new directory
init Create an empty Git repository or reinitialize an existing one
work on the current change (see also: git help everyday)
add Add file contents to the index
mv Move or rename a file, a directory, or a symlink
restore Restore working tree files
rm Remove files from the working tree and from the index
sparse-checkout Initialize and modify the sparse-checkout
如上面截图中底部我们可以有如下的描述,里面就提到了subcommands
'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.
See 'git help git' for an overview of the system.
2.8 可选参数(长选项、短选项)
在各种命令行中我们最常用的就是-h, --help
这种我们称作为可选参数,其中-h
我们称作为短选项
,--help
我们称作为长选项。其中需要提一点的是-h, --help
作用是相同的,就是为了简单,我们将--help
写成-h
。举例如下:
pi@raspberrypi:~ $ rfcomm -h
RFCOMM configuration utility ver 5.55
Usage:
rfcomm [options] <command> <dev>
Options:
-i, --device [hciX|bdaddr] Local HCI device or BD Address
-h, --help Display help
-r, --raw Switch TTY into raw mode
-A, --auth Enable authentication
-E, --encrypt Enable encryption
-S, --secure Secure connection
-M, --master Become the master of a piconet
-L, --linger [seconds] Set linger timeout
-a Show all devices (default)
Commands:
bind <dev> <bdaddr> [channel] Bind device
release <dev> Release device
show <dev> Show device
connect <dev> <bdaddr> [channel] Connect device
listen <dev> [channel [cmd]] Listen
watch <dev> [channel [cmd]] Watch
pi@raspberrypi:~ $
2.9 位置参数
在我们用命令时,后面是可以直接带参数的,举例:
pi@raspberrypi:/ $ ls /usr/
bin games include lib libexec local sbin share src
这里面的/usr/
就是一个位置参数。当然这只是一个称呼,位置参数不一定是一个路径,也可以是数值,文件名等。
三、argparse模块的使用
我们建立一个test_argparse.py的文件,并写一段最简单的argparse模块应用代码如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-o','--option')
parser.add_argument('position')
parser.parse_args()
运行结果如下:
$ python test_argparse.py -h
usage: test_argparse.py [-h] [-o OPTION] position
positional arguments:
position
optional arguments:
-h, --help show this help message and exit
-o OPTION, --option OPTION
我们再写一段代码告诉你我们如何调用获取到的参数:
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
我们用args.square调用我们获取到的参数4。
这里有三个最重要的类与方法:ArgumentParser
类, add_argument()
方法, parse_args()
方法。下面我们分章节介绍。
ArgumentParser
类: 建立一个ArgumentParser实例,也就是建立一个外层框架,并对命令行功能的描述等做一些限定。add_argument()
方法:主要用于添加位置参数和可选参数。parse_args()
方法:主要是读取我们在cmd窗口输入命令行的参数并解析他们。ArgumentParser().parse_args().argument_name
:来调用我们用parse_args()
方法获取到的参数并在程序中使用。
从上面的例子我们可知,我们使用此模块的流程如下:
3.1 parse_args()方法
将参数字符串转换为对象并将其设为命名空间的属性。 返回带有成员的命名空间。简单点说就是根据你输入的命令行,将对应的可选参数和位置参数赋值。
举个例子:
pi@raspberrypi:/ $ ls -l /opt/
total 20
drwxr-xr-x 5 root root 4096 Dec 2 2020 minecraft-pi
drwxr-xr-x 3 root root 4096 Dec 2 2020 pigpio
drwxr-xr-x 8 pi pi 4096 Nov 5 2021 pycharm-community-2021.2.3
drwxr-xr-x 6 root root 4096 Dec 2 2020 vc
drwxr-xr-x 4 root root 4096 Dec 2 2020 Wolfram
pi@raspberrypi:/ $ 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.
Mandatory arguments to long options are mandatory for short options too.
-a, --all do not ignore entries starting with .
-A, --almost-all do not list implied . and ..
在上述命令中就相当于FILE=‘/opt/’, l=True。
3.2 ArgumentParser类
argparse 模块对命令行接口的支持是围绕 argparse.ArgumentParser 的实例建立的。 它是一个用于参数规格说明的容器并包含多个全面应用解析器的选项。他的作用主要是修改下面红框中的描述以及一些全局性的设置。
每个参数在下面都有它更详细的描述。
参数 | 描述 | 示例 |
---|---|---|
prog | usage中的程序的名称 (默认值: 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) 不建议更改设置。 |
3.1.1 formatter_class
ArgumentParser 对象允许通过指定备用格式化类来自定义帮助格式。目前,有四种这样的类。
- class argparse.RawDescriptionHelpFormatter
- class argparse.RawTextHelpFormatter
- class argparse.ArgumentDefaultsHelpFormatter
- class argparse.MetavarTypeHelpFormatter
类的继承关系如下:
我们重点介绍RawDescriptionHelpFormatter和RawTextHelpFormatter。这两个用法很像,主要区别就在于换行的处理上。
不设置此参数时默认为HelpFormatter
:
import argparse
parser = argparse.ArgumentParser(
prog='PROG',
formatter_class=argparse.HelpFormatter,
description='This is a description for test.\nLine 1.\n\n\n\nLine 2.\n')
parser.add_argument('-f', help='Line1\n\n\nLine2\nLine3')
parser.print_help()
输出:
usage: PROG [-h] [-f F]
This is a description for test. Line 1. Line 2.
optional arguments:
-h, --help show this help message and exit
-f F Line1 Line2 Line3
这里不显示换行
将参数设置为RawDescriptionHelpFormatter
,description 和 epilog 中可以用换行符换行,但可选项的帮助描述中换行符不能换行:
将参数设置为RawTextHelpFormatter
,所有的帮助文本中都可以用换行符换行:
RawTextHelpFormatter
和RawDescriptionHelpFormatter
如果想在description 和 epilog 中连续换多行,那么\n
之间必须有空格。
3.3 add_argument()方法
这个方法就是用于给命令行加入可选参数和位置参数的。举个例子,就是添加下面-l
和/opt/
,所以对应的位置的参数:
pi@raspberrypi:/ $ ls -l /opt/
total 20
drwxr-xr-x 5 root root 4096 Dec 2 2020 minecraft-pi
drwxr-xr-x 3 root root 4096 Dec 2 2020 pigpio
drwxr-xr-x 8 pi pi 4096 Nov 5 2021 pycharm-community-2021.2.3
drwxr-xr-x 6 root root 4096 Dec 2 2020 vc
drwxr-xr-x 4 root root 4096 Dec 2 2020 Wolfram
这个方法也有很多形参可选,各个参数的功能如下:
参数 | 描述 | 示例 |
---|---|---|
name or flags | 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。 | 定义Usage: ls [OPTION] … [FILE] … |
action | 当参数在命令行中出现时使用的动作基本类型。只作用于可选参数 。有如下几种类型,重要的我前面加* :- store , 存储参数的值。这是默认的动作。-* store_const , 存储由 const 关键字参数指定的值;请注意 const 关键字参数默认为 None。-* store_true 和store_false , 这些是 store_const 分别用作存储 True 和 False 值的特殊用例。另外,它们的默认值分别为 False 和 True。- append , 存储一个列表,并将每个参数值添加到该列表。- append_const , 存储一个列表,并将由 const 关键字参数指定的值添加到列表中-* count , 计算一个关键字参数出现的数目或次数。- help , 打印所有当前解析器中的选项和参数的完整帮助信息,然后退出。- version , 期望有一个 version= 命名参数在 add_argument() 调用中,并打印版本信息并在调用后退出。- extend , 这会存储一个列表,并将每个参数值加入到列表中。 | |
nargs | 命令行参数应当消耗的数目。定义了参数最多可以有几个: - N (一个整数), 个参数会被聚集到一个列表中。注意,一旦定义了这个参数就必须有对应数量的参数跟着,否则会报错。- ? 可以有0或1个参数跟着。- * 可以有0或无线多个参数跟着。获取值存储为一个列表。- + 可以有1或无限多个参数跟着。获取值存储为一个列表。其实上面 N , ? , * , + 跟正则表达式中的用法很像。 | ? 我们需要做一些解释: |
const | 被一些 action 和 nargs 选择所需求的常数。默认值为 None - action为 store_const , store_append 时可选项后面未带参数的时候,以const的值对此可选参数赋值。- nargs 为? 时, 时可选项后面未带参数的时候,以const的值对此可选参数赋值。详情见nargs参数。 | |
default | 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值。 | 举个例子:命令行中有–list这个参数功能,但是你没写–list,那么他就给你list赋值为default对应的值。 |
type | 命令行参数应当被转换成的类型。 | 就是把你获取到的参数值作为一个函数的参数,传入到type=def中的def函数中处理一下并得到返回值。 例如: 当然我们也可以自定义这个函数,例如: |
choices | 由允许作为参数的值组成的序列。 | 我们可以框定一个参数可选的参数范围,比如我们只想让用户输出0~5之间 一个值,那么我们choices=range(0,6),参数列表也是可以的: |
required | 此命令行选项是否可省略 (仅选项可用)。 | |
help | 一个此选项作用的简单描述。 | |
metavar | 在使用方法消息中使用的参数值示例。 | |
dest | 被添加到 parse_args() 所返回对象上的属性名。 |
3.4 其它实用工具 ¶
这些也都是相对常用的方法,可以简单看一下。
3.4.1 子命令 ¶
3.4.2 参数组 ¶
主要对下面互斥命令有所帮助
3.4.3 互斥 ¶
里面用了参数组的概念,将互斥的参数分到一组