Python模块 —— argparse构建命令行

一、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()方法获取到的参数并在程序中使用。
      从上面的例子我们可知,我们使用此模块的流程如下:
使用从命令行获取到的参数值
建立和处理命令行的部分
args.argument_name来调用各个可选参数或位置参数并在代码中使用
args = parser.parse_args()获取命令行参数
parser.add_argument()添加对应的选项和参数
实例parser = argparse.ArgumentParser()类

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 的实例建立的。 它是一个用于参数规格说明的容器并包含多个全面应用解析器的选项。他的作用主要是修改下面红框中的描述以及一些全局性的设置。
在这里插入图片描述
  每个参数在下面都有它更详细的描述。

参数描述示例
progusage中的程序的名称 (默认值: 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
      类的继承关系如下:
HelpFormatter
RawDescriptionHelpFormatter
RawTextHelpFormatter
ArgumentDefaultsHelpFormatter
MetavarTypeHelpFormatter

  我们重点介绍RawDescriptionHelpFormatterRawTextHelpFormatter。这两个用法很像,主要区别就在于换行的处理上。
  不设置此参数时默认为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,所有的帮助文本中都可以用换行符换行:
在这里插入图片描述
  RawTextHelpFormatterRawDescriptionHelpFormatter如果想在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_truestore_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 互斥

  里面用了参数组的概念,将互斥的参数分到一组

在这里插入图片描述

参考文档

  1. 命令行语法格式
  2. argparse — 命令行选项、参数和子命令解析器
  3. argparse 教程
  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值