python命令行参数工具argparse使用

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

目录

介绍

argparse模块是 Python 标准库中推荐的命令行解析模块。使用此模块能很好的支持我们对命令行参数进行设置和解析。

argparse模块有三个主要方法

  1. ArgumentParser()用于创建命令行解析器对象
  2. add_argument()用于给解析器添加命令行参数
  3. parse_args()用于解析命令行的参数。

示例

# myarg.py
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

然后通过命令行执行文件

>>> python myarg.py --help
usage: myarg.py [-h]

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

如果命令行参数不是–help

>>> python myarg.py --random     
usage: myarg.py [-h]
myarg.py: error: unrecognized arguments: --random

在没有任何选项的情况下运行脚本不会在标准输出显示任何内容。
–help 选项也可缩写为 -h是唯一一个可以直接使用的选项即不需要指定该选项的内容。其他参数选项比如上面的–random如果想使用必须在参数解析对象指定。下面会讲解。

ArgumentParser

ArgumentParser是解析器对象有如下属性

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对象的时候绝大多数时候参数使用默认值即可。对于
各参数意义下面列出可酌情参考

  1. 【prog】 - 程序的名称默认值sys.argv[0]
  2. 【usage】 - 描述程序用途的字符串默认值从添加到解析器的参数生成
  3. 【description】 - 在参数帮助文档之前显示的文本默认值无
  4. 【epilog】 - 在参数帮助文档之后显示的文本默认值无
  5. 【parents】 - 一个 ArgumentParser 对象的列表它们的参数也应包含在内
  6. 【formatter_class】 - 用于自定义帮助文档输出格式的类
  7. 【prefix_chars】 - 可选参数的前缀字符集合默认值 ‘-’
  8. 【fromfile_prefix_chars】 - 当需要从文件中读取其他参数时用于标识文件名的前缀字符集合默认值 None
  9. 【argument_default】 - 参数的全局默认值默认值 None
  10. 【conflict_handler】 - 解决冲突选项的策略通常是不必要的
  11. 【add_help】 - 为解析器添加一个 -h/–help 选项默认值 True
  12. 【allow_abbrev】 - 如果缩写是无歧义的则允许缩写长选项 默认值True该参数从Python3.5开始才有。在Python3.8之前的版本中该参数还会禁用短旗标分组例如 -vv 表示为 -v-v。
  13. 【exit_on_error】 - 决定当错误发生时是否让 ArgumentParser 附带错误信息退出。该参数在Python3.9版本中才有 (默认值: True)

下面看一个简单的示例

import argparse
parser = argparse.ArgumentParser(prog='mytest',
                                 usage=f'[%(prog)s] 这个程序的用法信息',
                                 description='一些描述信息',
                                 argument_default=None,
                                 )
parser.parse_args()

打印结果如下

usage: [mytest] 这个程序的用法信息

一些描述信息

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

这里有一个用法%(prog)s可以在任何地方获取该程序的名称当没有使用prog进行自定义时默认就是sys.argv[0]的值否则返回prog定义的名称。

add_argument()

add_argument方法往参数对象中添加参数并且可以做一些限定。是用的最多的函数。

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

参数如下

  1. 【name or flags】 - 一个命名或者一个选项字符串的列表例如 foo 或 -f, --foo。
  2. 【action】 - 当参数在命令行中出现时使用的动作基本类型。
  3. 【nargs】 - 命令行参数应当消耗的数目。
  4. 【const】 - 被一些 action 和 nargs 选择所需求的常数。
  5. 【default】 - 当参数未在命令行中出现并且也不存在于命名空间对象时所产生的值。
  6. 【type】 - 命令行参数应当被转换成的类型。
  7. 【choices】 - 某参数限定只能是固定的几个值。
  8. 【required】 - 此命令行选项是否可省略 仅选项可用。
  9. 【help】 - 一个此选项作用的简单描述。
  10. 【metavar】 - 在使用方法消息中使用的参数值示例。
  11. 【dest】 - 被添加到 parse_args() 所返回对象上的属性名。

下面来看一下如何使用

1.命令行位置传参

如下使用add_argument依次添加两个参数db和read_only分别表示数据库名称和是否只读

import argparse


parser = argparse.ArgumentParser()
parser.add_argument("db")
parser.add_argument("read_only")
my_args = parser.parse_args()
print(my_args.db)
print(my_args.read_only)

parser.parse_args就是获取所有参数的命令空间后面可以通过参数名获取参数后面还会讲。

接着执行命令行

>>> python myarg.py order 1   
order
1

可以看到命令行输入的参数是按照位置传递给定义参数的也就是第一个添加的参数是db那命令行第一个参数好久赋值给他同理第二个是read_only。

2.设置可选参数

在参数前面加上--

import argparse


parser = argparse.ArgumentParser()
parser.add_argument("db")
parser.add_argument("--read_only")
my_args = parser.parse_args()
print(my_args.db)
print(my_args.read_only)

对于有可选参数的执行命令行时就要指明参数名称了如下

>>> python myarg.py order --read_only 1
order
1

否则报以下错误

usage: myarg.py [-h] [--read_only READ_ONLY] db
myarg.py: error: unrecognized arguments: 1

3.可选参数引用名

对于可选参数可以设置一个别名一般是缩写在命令行输入参数时使用别名即可

import argparse


parser = argparse.ArgumentParser()
parser.add_argument('-d', "--db")  # -d是别名
parser.add_argument('-ro',"--read_only")   # -ro是别名
my_args = parser.parse_args()
print(my_args.db)
print(my_args.read_only)

执行命令如下

>>> python myarg.py -d order -ro 1
order
1

4.设置参数解析类型

上面我们的r参数没有指定参数类型默认是字符串如果要指定参数的类型可以使用参数type来指定type可以是python的内置类型也可以自定义。

下面让read_only为int类型

import argparse


parser = argparse.ArgumentParser()
parser.add_argument('-d', "--db")
parser.add_argument('-ro', "--read_only", type=int)
my_args = parser.parse_args()
print(my_args.db)
print(my_args.read_only)
print(type(my_args.read_only))

执行命令

>>> python myarg.py -d order -ro 1
order
1
<class 'int'>

如果传的不是int就会报错

python myarg.py -d order -ro e
usage: myarg.py [-h] [-d DB] [-ro READ_ONLY]
myarg.py: error: argument -ro/--read_only: invalid int value: 'e'

5.设置参数默认值

使用default设置参数的默认值。注意会覆盖创建ArgumentParser对象时设置的默认值。

import argparse


parser = argparse.ArgumentParser()
parser.add_argument('-d', '--db')
parser.add_argument('-ro', '--read_only', type=int, default=0)
my_args = parser.parse_args()
print(my_args.db)
print(my_args.read_only)

执行命令行

python myarg.py -d order
order
0

6.设置参数必选

如果某个参数必填则可通过参数required设置为True默认False。

import argparse


parser = argparse.ArgumentParser()
parser.add_argument('-d', '--db')
parser.add_argument('-ro', '--read_only', type=int, required=True)
my_args = parser.parse_args()
print(my_args.db)
print(my_args.read_only)

执行命令行不给read_only参数报错

python myarg.py -d order
usage: myarg.py [-h] [-d DB] -ro READ_ONLY
myarg.py: error: the following arguments are required: -ro/--read_only

7.参数解析动作

注意这个和type不一样功能更加丰富强大。

这个参数主要定义了ArgumentParser对象实例如何对传入的参数进行“理解”。

比如在命令行下我们使用python test.py -f fvalue

对于这个’-f’选项字符我们希望解析器如何解析这个参数呢是把它当成bool类型的值还是一个列表亦或者是一个普通的常量或我们自定义的值这需要我们使用action参数进行规范。

action可以有以下几种

  • store保存值可能首先要转换成一个不同的类型可选如果没有显示指定任action则默认就是这个选项。
  • store_const保存参数规范中定义的一个值而不是来自所解析参数的一个值这通常用于实现非布尔类型值的命令行标志。
  • store_true / store_false保存适当的布尔值这些动作对于实现Boolean分支语句很有用。
  • append将值保存到一个列表中如果参数重复则保存多个值
  • append_const将参数规范中定义的一个值保存到一个列表
  • version打印程序的版本详细信息然后退出
  • count计算一个关键字参数出现的数目或者次数
  • help打印所有当前解析器中的选项和参数的完整帮助信息然后退出。默认情况下一个help动作会被自动加入解析器。
  • extend这会存储一个列表并将每个参数值加入到列表中。

下面看一个例子

import argparse


parser = argparse.ArgumentParser()
parser.add_argument('-d', '--db', action='append')
parser.add_argument('-ro', '--read_only', action='store_true', default=True)
my_args = parser.parse_args()
print(my_args.db)
print(my_args.read_only)

上面把数据参数db存储在一个列表这样可以指定多个数据库。

把read_only设置为布尔值这时参数名后面不需要再输入值只要参数名即可。

>>> python myarg.py -d order -d user -ro
['order', 'user']
True

8.设置参数个数

命令行参数应当消耗的数目。可选择的项目有

N 类型为一个整数表示参数的绝对个数。
“?”0个或1个参数
“*”0或所有参数
“+”所有参数至少有1个

例如上面多个数据库时可以指定为"+"不限个数

import argparse


parser = argparse.ArgumentParser()
parser.add_argument('-d', '--db', nargs='+')
parser.add_argument('-ro', '--read_only', action='store_true', default=True)
my_args = parser.parse_args()
print(my_args.db)
print(my_args.read_only)

执行命令行

>>> python myarg.py -d order user product
['order', 'user', 'product']
True

parse_args()

上面我们也已经看到parse_args() 方法用来解析参数。

它将检查命令行把每个参数转换为适当的类型然后调用相应的操作。

这个方法返回的是一个Namespace对象

import argparse


parser = argparse.ArgumentParser()
parser.add_argument('-d', '--db', nargs='+')
parser.add_argument('-ro', '--read_only', action='store_true', default=True)
my_args = parser.parse_args()
print(my_args)

执行

>>> python myarg.py -d order user product
Namespace(db=['order', 'user', 'product'], read_only=True)

通过获取Namespace对象属性可以直接获取我们需要的参数。

参考
https://docs.python.org/zh-cn/3/library/argparse.html
https://baijiahao.baidu.com/s?id=1717923123351711758
https://baijiahao.baidu.com/s?id=1718374767545536224

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python