什么是 argparse?
argparse 的主要作用是:

- 定义参数:告诉你的程序它接受哪些命令行参数。
- 解析参数:当用户运行你的脚本并提供参数时,
argparse会自动解析这些参数。 - 生成帮助信息:自动生成像
python script.py -h这样的帮助信息,告诉用户如何使用你的脚本。 - 错误处理:当用户提供了无效参数时,
argparse会自动报错并打印出帮助信息。
argparse 的基本使用步骤
使用 argparse 通常遵循以下三个步骤:
- 导入模块:
import argparse - 创建解析器对象:
parser = argparse.ArgumentParser(description='...') - 添加参数:
parser.add_argument('...') - 解析参数:
args = parser.parse_args()
下面我们通过一个简单的例子来走一遍这个流程。
示例 1:一个简单的脚本
假设我们有一个脚本 greet.py,它接受一个名字作为参数,并打印一条问候语。
代码 (greet.py):

import argparse
# 1. 创建 ArgumentParser 对象
# description 参数会在帮助信息中显示在程序名称之后
parser = argparse.ArgumentParser(description="一个简单的问候脚本。")
# 2. 添加参数
# 'name' 是一个位置参数 (positional argument)
# help 参数提供了该参数的简短描述
parser.add_argument('name', type=str, help='要问候的人的名字')
# 3. 解析参数
# parse_args() 会从命令行读取参数,并返回一个包含这些参数的命名空间对象
args = parser.parse_args()
# 4. 使用解析到的参数
print(f"你好, {args.name}! 欢迎使用 argparse。")
如何运行:
打开终端或命令行,进入 greet.py 所在的目录。
-
正常执行:
python greet.py Alice
输出:
(图片来源网络,侵删)你好, Alice! 欢迎使用 argparse。 -
查看帮助信息:
python greet.py -h # 或者 python greet.py --help
输出:
usage: greet.py [-h] name 一个简单的问候脚本。 positional arguments: name 要问候的人的名字 options: -h, --help show this help message and exit -
不提供参数(会报错):
python greet.py
输出:
usage: greet.py [-h] name greet.py: error: the following arguments are required: name
argparse 的核心功能详解
argparse 的强大之处在于 add_argument() 方法,它允许你定义各种类型的参数。
位置参数
这些参数是必需的,它们的顺序由用户在命令行中提供的顺序决定,就像上面的 name 一样。
parser.add_argument('filename') # 用户必须提供一个文件名
可选参数
这些参数以 或 开头,是可选的。
- 短选项:
-f - 长选项:
--file
add_argument() 可以同时指定短选项和长选项。
parser.add_argument('-o', '--output', help='指定输出文件的路径')
如何运行:
# 使用短选项 python script.py -o result.txt # 使用长选项 python script.py --output result.txt # 不提供(args.output 将会是 None) python script.py
参数类型
你可以强制参数为特定类型,如果类型不匹配,argparse 会自动报错。
type=int:必须是整数type=float:必须是浮点数type=str:默认就是字符串type=bool:注意,布尔值比较特殊,通常用action来处理。
parser.add_argument('--count', type=int, help='一个整数计数')
如何运行:
python script.py --count 10 # 正确 python script.py --count ten # 输出: # usage: script.py [-h] [--count COUNT] # script.py: error: argument --count: invalid int value: 'ten'
默认值
如果用户没有提供可选参数,可以为其设置一个默认值。
parser.add_argument('--verbose', '-v', action='store_true', default=False, help='启用详细输出')
这里我们使用了 action='store_true',这是一种更简洁的布尔值处理方式,如果用户提供了 -v,args.verbose 就会是 True,否则就是 False。
互斥参数
有时,一组参数中只能选择一个。argparse 提供了 add_mutually_exclusive_group() 来实现这一点。
group = parser.add_mutually_exclusive_group()
group.add_argument('--verbose', action='store_true', help='启用详细输出')
group.add_argument('--quiet', action='store_true', help='禁用输出')
如何运行:
python script.py --verbose # 正确 python script.py --quiet # 正确 python script.py --verbose --quiet # 错误!会报错
选项参数
action 参数定义了当解析到某个参数时应该执行的操作,除了 store_true,还有:
store(默认):存储参数的值。store_const:存储一个预先定义的常量,常量由const参数指定。append:将参数的值添加到一个列表中,可以多次使用该参数。count:计算参数出现的次数。-vv会让args.verbose的值为2。help:打印帮助信息并退出。version:打印版本信息并退出。
示例 (append 和 version):
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--file', '-f', action='append', help='要处理的文件,可以多次指定')
parser.add_argument('--version', action='version', version='%(prog)s 1.0')
args = parser.parse_args()
print("你提供的文件是:", args.file)
如何运行:
python script.py -f data1.txt -f data2.txt # 输出: # 你提供的文件是: ['data1.txt', 'data2.txt'] python script.py --version # 输出: # script.py 1.0
综合示例:一个功能更完整的脚本
让我们创建一个名为 downloader.py 的脚本,它可以下载指定 URL 的内容,并支持一些高级选项。
代码 (downloader.py):
import argparse
import requests # 需要先安装: pip install requests
def download_file(url, output_filename, chunk_size=8192):
"""下载文件并保存到本地"""
try:
print(f"正在从 {url} 下载...")
with requests.get(url, stream=True) as r:
r.raise_for_status() # 如果请求失败 (状态码不是 2xx), 则抛出异常
with open(output_filename, 'wb') as f:
for chunk in r.iter_content(chunk_size=chunk_size):
f.write(chunk)
print(f"下载完成,已保存为 {output_filename}")
except requests.exceptions.RequestException as e:
print(f"下载失败: {e}")
def main():
# 1. 创建解析器
parser = argparse.ArgumentParser(
description="一个简单的命令行文件下载工具。",
formatter_class=argparse.ArgumentDefaultsHelpFormatter # 显示默认值
)
# 2. 添加参数
# --- 位置参数 ---
parser.add_argument(
'url',
help='要下载文件的 URL'
)
# --- 可选参数 ---
parser.add_argument(
'-o', '--output',
help='输出文件的名称',
default='downloaded_file'
)
parser.add_argument(
'-v', '--verbose',
help='启用详细输出模式',
action='store_true'
)
# --- 互斥参数组 ---
group = parser.add_mutually_exclusive_group()
group.add_argument(
'--quiet',
help='静默模式,不打印任何信息',
action='store_true'
)
group.add_argument(
'--verbose',
help='启用详细输出模式',
action='store_true'
)
# --- 互斥参数组结束 ---
# 3. 解析参数
args = parser.parse_args()
# 4. 使用参数
if args.quiet:
# 静默模式,什么都不打印
pass
elif args.verbose:
print("详细模式已开启。")
print(f"URL: {args.url}")
print(f"输出文件名: {args.output}")
download_file(args.url, args.output)
if __name__ == '__main__':
main()
如何运行 downloader.py:
# 1. 查看帮助 python downloader.py -h # 2. 下载一张图片,默认文件名 python downloader.py https://www.python.org/static/community_logos/python-logo-master-v3-TM.png # 3. 下载并指定输出文件名 python downloader.py https://www.python.org/static/community_logos/python-logo-master-v3-TM.png -o python_logo.png # 4. 启用详细模式 python downloader.py https://www.python.org/static/community_logos/python-logo-master-v3-TM.png --verbose # 5. 尝试静默模式 python downloader.py https://www.python.org/static/community_logos/python-logo-master-v3-TM.png --quiet
| 功能 | 方法/参数 | 描述 |
|---|---|---|
| 创建解析器 | argparse.ArgumentParser() |
创建一个参数解析器对象。 |
| 添加参数 | add_argument() |
向解析器添加一个参数定义。 |
| 位置参数 | parser.add_argument('name') |
必需参数,按位置匹配。 |
| 可选参数 | parser.add_argument('-n', '--name') |
可选参数,以 或 开头。 |
| 类型检查 | type=int, type=float |
强制参数转换为指定类型。 |
| 默认值 | default='value' |
如果参数未提供,则使用此默认值。 |
| 动作 | action='store_true' |
定义参数的行为,如存储布尔值、追加到列表等。 |
| 互斥参数 | add_mutually_exclusive_group() |
创建一组互斥的参数,只能选一个。 |
| 帮助信息 | help='...' |
为参数提供帮助文本。 |
| 解析参数 | parse_args() |
解析命令行输入,返回一个包含参数的 args 对象。 |
argparse 是 Python 脚本自动化的利器,掌握它能极大地提升你编写工具和脚本的效率和用户体验,从上面的例子可以看出,它非常直观且功能全面。
