下面我将详细介绍 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 sysdef 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 argparsedef 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 getoptimport sysdef usage (): print ("用法: script.py -i <输入文件> -o <输出文件> [-v|--verbose]" ) def main (): try : opts, args = getopt.getopt( sys.argv[1 :], "hi⭕ v" , ["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 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