如果你使用过 Linux 系统,是不是经常通过 --help 查看某个命令的帮助信息,例如:
root@localhost:~# 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 ..
--author with -l, print the author of each file
-b, --escape print C-style escapes for nongraphic characters
--block-size=SIZE with -l, scale sizes by SIZE when printing them;
e.g., '--block-size=M'; see SIZE format below
-B, --ignore-backups do not list implied entries ending with ~
-c with -lt: sort by, and show, ctime (time of last
modification of file status information);
with -l: show ctime and sort by name;
otherwise: sort by ctime, newest first
...在 Python 中,内置的 argparse 模块就是用来解析命令行参数和选项的,可以让你的 Python 脚本可以像系统命令一样接收参数、显示帮助、校验输入。
argpase 模块主要干下面几件事:
让脚本支持命令行传参,例如:python script.py --name Tom --age 20
使用 -h 或者 --help 时,自动生成帮助文档
自动校验参数类型、必填项、可选值
支持位置参数、可选参数、标志位、子命令等
该模块按照下面 4 步固定套路来使用,直接照搬就是:
创建解析器:argparse.ArgumentParser()
添加参数:parser.add_argument()
解析参数:args = parser.parse_args()
使用参数:通过“args.参数名”获取值
例如:
import argparse
# 创建解析器(description=脚本说明,epilog=结尾说明)
parser = argparse.ArgumentParser(
description="这是一个 argparse 演示脚本",
epilog="作者:Python 学习者"
)
# 添加参数
parser.add_argument("name", help="姓名")
# 解析参数
args = parser.parse_args()
# 访问参数
print(f"姓名:{args.name}")注意,add_argument() 是该模块的最常用方法,支持位置参数、可选参数、类型、默认值、必填、帮助信息等。参数常用配置:
| 参数 | 作用 |
| name/flags | 参数名:name(位置参数)、--name(可选参数)、-n(短参数) |
| type | 参数类型:int/str/float |
| default | 默认值 |
| required | 是否必填(True/False) |
| help | 参数帮助说明 |
| choices | 限定参数可选值(如 ["add", "delete"]) |
| action | 特殊动作:store_true(布尔标志位) |
直接使用 ArgumentParser 的 add_argument() 函数添加参数信息,如参数名,类型,帮助信息等。注意,这种参数是必填,必须按顺序传。否则会出现问题:
import argparse
# 创建解析器
parser = argparse.ArgumentParser(description="位置参数示例")
# 添加位置参数(必填)
parser.add_argument("name", help="姓名")
parser.add_argument("age", type=int, help="年龄")
# 解析参数
args = parser.parse_args()
# 打印参数
print(f"姓名:{args.name}")
print(f"年龄:{args.age}")运行结果:
# 传递两个参数
$ python demo.py 张三 25
姓名:张三
年龄:25
# 不传递参数,直接返回错误信息,包含了如何使用命令的说明信息
$ python demo.py
usage: demo.py [-h] name age
demo.py: error: the following arguments are required: name, age
# 如果我们将参数位置整乱了,将姓名传递给age,将年龄传递给name,由于 age 参数类型限制为int
# 因此,将抛出错误信息
$ python demo.py 25 张三
usage: demo.py [-h] name age
demo.py: error: argument age: invalid int value: '张三'演示如何使用可选参数,可选参数需要添加 -- 前缀,例如:
import argparse
parser = argparse.ArgumentParser(description="可选参数示例")
# 可选参数:--city,短参数 -c
# default 用来定义默认值
# help 用来指定帮助信息
parser.add_argument("-c", "--city", default="北京", help="城市,默认北京")
parser.add_argument("-s", "--score", type=float, help="分数")
args = parser.parse_args()
print("城市:", args.city)
print("分数:", args.score)运行结果:
# 什么参数也不指定,则使用默认值
$ python demo.py
城市: 北京
分数: None
# 使用 -c 短参数指定城市为“成都”
$ python demo.py -c 成都
城市: 成都
分数: None
# 同时使用 -c 和 -s 指定城市和分数
$ python demo.py -c 成都 -s 90.5
城市: 成都
分数: 90.5
# 可选参数是没有顺序的,因为我们使用 “-参数名 参数值” 进行了绑定
$ python demo.py -s 90.5 -c 成都
城市: 成都
分数: 90.5
# 注意了,我们可以使用 -h 内置的参数查看帮助信息
# 对照上面代码,是不是一眼就看出 -c --city 的作用以
$ python demo.py -h
usage: demo.py [-h] [-c CITY] [-s SCORE]
可选参数示例
options:
-h, --help show this help message and exit
-c, --city CITY 城市,默认北京
-s, --score SCORE 分数布尔标识参数,用于开关选项,指定了这类参数就表示你同意这么去做。如果没有指定该参数,则不开启该功能个。例如 --debug,如果在参数中指定了 --debug 表示开启调试,不指定就不开启调试。例如:
import argparse
# 创建ArgumentParser对象
parser = argparse.ArgumentParser(description="布尔参数示例")
# 定义布尔标志参数
parser.add_argument("-d", "--debug", action="store_true", help="开启调试模式")
# 解析参数
args = parser.parse_args()
if args.debug:
print("调试模式已开启!")
else:
print("正常模式")运行结果:
# 正常运行,没有指定任何参数
$ python demo.py
正常模式
# 指定了 --debug 参数,开启调试
$ python demo.py --debug
调试模式已开启!
# 使用 -d 短参数开启调试
$ python demo.py -d
调试模式已开启!
# 使用 -h 查看帮助信息
$ python demo.py -h
usage: demo.py [-h] [-d]
布尔参数示例
options:
-h, --help show this help message and exit
-d, --debug 开启调试模式设置参数的可选值列表,强制参数只能从指定列表中选一个,例如:
import argparse
# 创建命令行解析器
parser = argparse.ArgumentParser(description="限定值示例")
# 添加命令行参数
parser.add_argument("op", choices=["add", "delete", "query"], help="操作类型")
# 解析命令行参数
args = parser.parse_args()
print("执行操作:", args.op)运行结果:
# 不携带任何参数,直接出错,参数定义没有添加 -- 前缀,是必选参数
$ python demo.py
usage: demo.py [-h] {add,delete,query}
demo.py: error: the following arguments are required: op
# 使用可选范围内的值,运行成功
$ python demo.py add
执行操作: add
# 使用可选范围以外的值,运行失败
$ python demo.py find
usage: demo.py [-h] {add,delete,query}
demo.py: error: argument op: invalid choice: 'find' (choose from add, delete, query)默认情况下没有添加 -- 前缀的位置参数是必填的,添加了 -- 前缀的参数是可选的,但是我们可以为参数添加 required=True 来强制 -- 开头的参数也必填。例如:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-u", "--username", required=True, help="用户名(必填)")
args = parser.parse_args()
print("用户名:", args.username)运行结果:
$ python demo.py
usage: demo.py [-h] -u USERNAME
demo.py: error: the following arguments are required: -u/--username
$ python demo.py -u 张三
用户名: 张三到这里,你应该对 argparse 模块有一定的了解了,更多 argparse 模块内容请参考 https://docs.python.org/3/library/argparse.html 文档。