概览:Python 命令行处理方案
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
sys.argv |
简单脚本,少量参数 | 无需安装库,Python 内置 | 功能有限,解析麻烦,无法生成帮助信息 |
argparse |
推荐,绝大多数场景 | 功能强大,自动生成帮助信息,支持子命令 | 代码稍显冗长 |
click |
构建复杂、优雅的 CLI 工具 | 代码简洁,易于扩展,支持装饰器 | 需要安装第三方库 |
typer |
现代 CLI,基于 click 和 type hints |
代码极简,类型安全,自动生成文档 | 需要安装第三方库 |
sys.argv - 最基础的方式
这是 Python 内置的方法,直接获取命令行传入的所有参数,并以列表的形式存储在 sys.argv 中。

sys.argv[0]:永远是脚本自身的名称。sys.argv[1]:第一个参数,以此类推。
示例:
创建一个文件 add.py。
# add.py
import sys
# 检查参数数量是否正确
if len(sys.argv) != 3:
print("用法: python add.py <数字1> <数字2>")
sys.exit(1) # 退出程序,返回错误码1
try:
# 将参数从字符串转换为整数
num1 = int(sys.argv[1])
num2 = int(sys.argv[2])
result = num1 + num2
print(f"结果是: {result}")
except ValueError:
print("错误:请输入有效的数字。")
如何运行:
# 正确运行 python add.py 10 20 # 输出: 结果是: 30 # 参数错误 python add.py 10 # 输出: 用法: python add.py <数字1> <数字2> # 类型错误 python add.py ten twenty # 输出: 错误:请输入有效的数字。
适合非常简单的脚本,但一旦参数变多或需要更复杂的功能(如可选参数 -v),sys.argv 会变得非常难用。
argparse - Python 标准库,功能强大
argparse 是 Python 标准库的一部分,是构建命令行界面的推荐方式,它能自动生成帮助信息、处理参数类型、可选参数、位置参数等。

核心概念:
ArgumentParser: 创建解析器对象。add_argument(): 添加参数定义。-
- 位置参数: 必须提供的参数。
-
- 可选参数: 带 或 前缀的参数。
-
- 动作: 如
store_true(布尔开关),count(计数)。
- 动作: 如
示例:
创建一个文件 greet.py。
# greet.py
import argparse
# 1. 创建解析器
parser = argparse.ArgumentParser(
description="一个简单的问候程序",
epilog="感谢使用!"
)
# 2. 添加参数
# 添加一个位置参数 'name'
parser.add_argument("name", type=str, help="要问候的人的名字")
# 添加一个可选参数 '--age',类型为整数
parser.add_argument("--age", type=int, help="被问候者的年龄")
# 添加一个布尔开关式可选参数 '--verbose'
parser.add_argument("-v", "--verbose", action="store_true", help="显示更详细的问候信息")
# 3. 解析参数
args = parser.parse_args()
# 4. 使用参数
if args.verbose:
print(f"正在向 {args.name}({args.age}岁)进行详细问候...")
print(f"你好,{args.name}!祝你今天过得愉快!")
else:
print(f"你好, {args.name}!")
如何运行:
# 显示帮助信息 (自动生成) python greet.py -h # 输出: # usage: greet.py [-h] [--age AGE] [-v] name # 一个简单的问候程序 # positional arguments: # name 要问候的人的名字 # options: # -h, --help show this help message and exit # --age AGE 被问候者的年龄 # -v, --verbose 显示更详细的问候信息 # 感谢使用! # 基本用法 python greet.py Alice # 输出: 你好, Alice! # 使用可选参数 python greet.py Bob --age 30 # 输出: 你好, Bob! # 使用布尔开关 python greet.py Charlie -v # 输出: # 正在向 Charlie(None岁)进行详细问候... # 你好,Charlie!祝你今天过得愉快! # 组合使用 python greet.py David --age 25 -v # 输出: # 正在向 David(25岁)进行详细问候... # 你好,David!祝你今天过得愉快!
argparse 非常强大,是 Python 开发者必须掌握的工具,对于绝大多数项目来说,它已经足够。

click - 第三方库,更简洁优雅
click 是一个非常流行的第三方库,旨在让编写命令行工具的过程变得快速、有趣和强大,它使用装饰器来定义命令,代码通常比 argparse 更简洁。
安装:
pip install click
示例:
创建一个文件 cli_tool.py。
# cli_tool.py
import click
@click.command()
@click.option('--count', default=1, help='重复的次数。')
@click.option('--name', prompt='你的名字', help='要问候的对象。')
def hello(count, name):
"""一个简单的问候程序。"""
for _ in range(count):
click.echo(f"你好, {name}!")
if __name__ == '__main__':
hello()
如何运行:
# 运行程序,它会提示你输入名字 python cli_tool.py # 输出: 你的名字: Alice # 你好, Alice! # 使用选项 python cli_tool.py --count 3 --name Bob # 输出: 你好, Bob! # 你好, Bob! # 你好, Bob! # 查看帮助 python cli_tool.py --help # 输出: # Usage: cli_tool.py [OPTIONS] # # 一个简单的问候程序。 # # Options: # --count INTEGER 重复的次数。 # --name TEXT 要问候的对象。 # --help Show this message and exit.
click 的代码更易于阅读和维护,特别适合构建复杂的、多命令的 CLI 工具。
typer - 现代 CLI 的未来
typer 是一个基于 click 的新兴库,最大的特点是充分利用 Python 的 类型提示 (Type Hints),这使得你的代码不仅是文档,还能被工具(如 IDE)检查,并且可以自动生成漂亮的文档。
安装:
pip install typer
示例:
创建一个文件 modern_cli.py。
# modern_cli.py
import typer
from typing import Optional
app = typer.Typer()
@app.command()
def hello(
name: str = typer.Option(..., help="要问候的人的名字"),
age: Optional[int] = typer.Option(None, help="被问候者的年龄"),
verbose: bool = typer.Option(False, "--verbose", help="显示详细信息"),
):
"""
一个使用类型提示的现代化问候程序。
"""
if verbose:
if age:
typer.echo(f"正在向 {name}({age}岁)进行详细问候...")
else:
typer.echo(f"正在向 {name} 进行详细问候...")
else:
typer.echo(f"你好, {name}!")
if __name__ == "__main__":
app()
如何运行:
# 运行,会自动提示你输入没有默认值的参数 python modern_cli.py # 输出: 请输入 name: Charlie # 使用选项 python modern_cli.py --name David --age 40 --verbose # 输出: 正在向 David(40岁)进行详细问候... # 查看帮助 python modern_cli.py --help # 输出非常美观,并且是基于你的类型提示自动生成的。
如果你喜欢现代 Python 的写法,并且重视代码的类型安全和可读性,typer 是一个绝佳的选择。
如何选择?
- 新手或简单脚本:从
sys.argv开始,了解基本概念。 - 绝大多数情况:使用
argparse,它是标准库,功能足够强大,无需额外安装。 - 追求代码简洁和优雅:使用
click,特别是当你需要构建一个复杂的、多命令的 CLI 工具时。 - 拥抱现代 Python 和类型安全:选择
typer,它是未来的趋势,能写出非常健壮和清晰的代码。
