Python 命令行参数详解

下面我将详细介绍 Python 中处理命令行参数的四种主要方式,包括基本用法、参数类型、常用功能和示例。

sys.argv - 最基础的方式

基本介绍

sys.argv 是 Python 中最简单的获取命令行参数的方式,它是一个包含所有命令行参数的列表。

特点

  • sys.argv[0] 是脚本名称
  • 后续元素是按顺序排列的参数
  • 没有参数解析功能,需要手动处理

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import sys


def main():
print(f"脚本名称: {sys.argv[0]}")
print(f"所有参数: {sys.argv[1:]}")

if len(sys.argv) < 2:
print("请至少提供一个参数")
return

# 处理参数
for i, arg in enumerate(sys.argv[1:], 1):
print(f"参数 {i}: {arg}")


if __name__ == "__main__":
main()

运行示例

1
2
3
4
5
6
$ python script.py arg1 arg2 arg3
脚本名称: script.py
所有参数: ['arg1', 'arg2', 'arg3']
参数 1: arg1
参数 2: arg2
参数 3: arg3

适用场景

  • 非常简单的脚本
  • 只需要获取基本参数列表
  • 不需要复杂的参数解析

argparse - 标准库推荐方式

基本介绍

argparse 是 Python 标准库中功能最强大的参数解析模块,可以处理各种复杂的命令行参数需求。

核心功能

  • 自动生成帮助和使用信息
  • 支持位置参数和可选参数
  • 支持多种参数类型
  • 支持子命令

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import argparse


def main():
# 创建解析器
parser = argparse.ArgumentParser(
description='一个示例程序,演示argparse的使用',
epilog='更多信息请访问...')

# 添加位置参数
parser.add_argument('filename', help='要处理的文件名')

# 添加可选参数
parser.add_argument('-v', '--verbose', action='store_true',
help='显示详细输出')
parser.add_argument('-o', '--output', metavar='FILE',
help='输出文件路径')
parser.add_argument('--speed', type=int, choices=[1, 2, 3],
default=2, help='处理速度 (1-3)')

# 解析参数
args = parser.parse_args()

# 使用参数
print(f"处理文件: {args.filename}")
if args.verbose:
print("详细模式已启用")
if args.output:
print(f"结果将输出到: {args.output}")
print(f"处理速度: 级别 {args.speed}")


if __name__ == "__main__":
main()

运行示例

1
2
3
4
5
$ python script.py input.txt -v --output result.txt --speed 3
处理文件: input.txt
详细模式已启用
结果将输出到: result.txt
处理速度: 级别 3

常用参数类型

  • action='store_true' - 标志参数,不需要值
  • type=int/float/str - 指定参数类型
  • choices=[...] - 限制参数取值范围
  • default=value - 设置默认值
  • nargs='+' - 接受一个或多个值
  • metavar='NAME' - 在帮助信息中显示的参数名

适用场景

  • 需要复杂参数解析的脚本
  • 需要自动生成帮助信息
  • 需要参数验证和类型转换

getopt - 类似C语言的风格

基本介绍

getopt 模块提供了类似C语言 getopt() 函数的命令行参数解析功能,适合熟悉POSIX风格命令行选项的用户。

特点

  • 支持短选项 (-h) 和长选项 (--help)
  • 需要手动处理参数
  • 错误处理较为基础

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import getopt
import sys


def usage():
print("用法: script.py -i <输入文件> -o <输出文件> [-v|--verbose]")


def main():
try:
# 定义短选项和长选项
# 冒号表示选项需要参数
opts, args = getopt.getopt(
sys.argv[1:],
"hiv",
["help", "input=", "output=", "verbose"])
except getopt.GetoptError as err:
print(err)
usage()
sys.exit(2)

input_file = None
output_file = None
verbose = False

for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit()
elif o in ("-i", "--input"):
input_file = a
elif o in ("-o", "--output"):
output_file = a
elif o in ("-v", "--verbose"):
verbose = True

# 检查必要参数
if not input_file or not output_file:
print("错误: 需要指定输入和输出文件")
usage()
sys.exit(2)

print(f"输入文件: {input_file}")
print(f"输出文件: {output_file}")
print(f"详细模式: {'开启' if verbose else '关闭'}")
print(f"剩余参数: {args}")


if __name__ == "__main__":
main()

运行示例

1
2
3
4
5
$ python script.py -i input.txt -o output.txt -v arg1 arg2
输入文件: input.txt
输出文件: output.txt
详细模式: 开启
剩余参数: ['arg1', 'arg2']

适用场景

  • 需要 POSIX 风格选项的脚本
  • 简单的参数解析需求
  • 需要与现有 shell 脚本保持一致的参数风格

click - 第三方高级库

基本介绍

click 是一个第三方库,用于创建美观的命令行界面,比 argparse 更简洁强大。

特点

  • 装饰器语法,代码更简洁
  • 自动生成美观的帮助信息
  • 支持参数类型自动转换
  • 支持命令组和子命令
  • 支持颜色输出

安装

1
pip install click

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import click


@click.command()
@click.option('--count', default=1, help='重复次数', type=int)
@click.option('--name', prompt='请输入你的名字', help='问候的人')
@click.option('--color', type=click.Choice(['red', 'blue', 'green']),
help='输出颜色')
def hello(count, name, color):
"""简单的问候程序"""
for _ in range(count):
message = f"你好, {name}!"
if color:
message = click.style(message, fg=color)
click.echo(message)


if __name__ == '__main__':
hello()

运行示例

1
2
3
4
5
$ python script.py --count=3 --color=green
请输入你的名字: 张三
你好, 张三!
你好, 张三!
你好, 张三!

高级功能

  • 参数类型: 支持 int, float, bool, click.File, click.Path
  • 交互式提示: 使用 prompt 参数可以提示用户输入
  • 颜色输出: 使用 click.style() 添加颜色
  • 子命令: 使用 @click.group() 创建命令组

适用场景

  • 需要创建美观CLI工具
  • 需要交互式输入
  • 需要颜色输出等高级功能
  • 项目已经使用其他 click 集成的库(如Flask)

总结对比

特性 sys.argv argparse getopt click
易用性 ★★★★ ★★★ ★★ ★★★★★
功能强大 ★★★★ ★★ ★★★★★
帮助生成 ★★★★ ★★★★★
类型转换 ★★★★ ★★★★★
交互式提示 ★★★★
子命令支持 ★★★ ★★★★★
颜色输出 ★★★★
标准库

选择建议:

  • 极简需求:sys.argv
  • 标准需求:argparse
  • POSIX风格:getopt
  • 高级需求:click
本文结束 感谢您的阅读
正在加载今日诗词....