2. 解析命令行参数并支持选项

任务说明

编写一个命令行参数解析程序,支持短选项 -a 与长选项 --all,并处理带值的选项(如 -o value 或 --output value)。程序需能区分选项与位置参数,并在遇到未知选项时给出错误提示。

实现方案

使用 Python 标准库 argparse 实现参数解析。该库原生支持短选项、长选项、选项值及自动生成帮助信息,无需额外依赖。程序定义三个参数:-a/--all(布尔开关)、-o/--output(带值选项)、files(位置参数,可多个)。解析后打印各参数值,便于验证。

代码实现

import argparse

def parse_args():
    parser = argparse.ArgumentParser(
        description="命令行参数解析示例:支持短选项、长选项与选项值"
    )
    # 短选项 -a 与长选项 --all,布尔开关,store_true 表示出现即为 True
    parser.add_argument("-a", "--all", action="store_true",
                        help="显示所有文件(含隐藏文件)")
    # 带值选项 -o 与 --output,需要传入一个参数值
    parser.add_argument("-o", "--output", metavar="PATH",
                        help="指定输出文件路径")
    # 位置参数,可接收零个或多个文件名
    parser.add_argument("files", nargs="*", help="要处理的文件名")

    return parser.parse_args()

def main():
    args = parse_args()
    print(f"all 选项: {args.all}")
    print(f"output 选项值: {args.output}")
    print(f"位置参数: {args.files}")

if __name__ == "__main__":
    main()

运行与验证

将上述代码保存为 cli_parser.py,在终端执行以下命令验证不同场景:

# 场景1:仅使用短选项 -a
python cli_parser.py -a file1.txt

# 场景2:使用长选项 --all 与 --output 带值
python cli_parser.py --all --output result.txt file1.txt file2.txt

# 场景3:混合使用短选项与位置参数
python cli_parser.py -o out.log data.csv

# 场景4:查看自动生成的帮助信息
python cli_parser.py --help

判定标准:

  • 场景1输出中 all 选项: True,位置参数为 ['file1.txt'];
  • 场景2输出中 all 选项: True,output 选项值: result.txt,位置参数为 ['file1.txt', 'file2.txt'];
  • 场景3输出中 all 选项: False,output 选项值: out.log,位置参数为 ['data.csv'];
  • 场景4显示包含 -a/--all、-o/--output 及 files 的用法说明;
  • 若输入未知选项(如 python cli_parser.py -x),程序报错并提示 unrecognized arguments,退出码非0。
argparse 参数解析流程 python cli_parser.py -a --output result.txt file1.txt file2.txt ArgumentParser 解析 args.all True (布尔开关) args.output "result.txt" (选项值) args.files ["file1.txt", "file2.txt"] print(f"all 选项: {args.all}") print(f"output 选项值: {args.output}")

关键说明

  • action="store_true" 使 -a/--all 成为布尔开关,出现即为 True,不接收额外值;
  • -o/--output 通过 metavar="PATH" 提示用户需要传入路径值;
  • nargs="*" 允许位置参数 files 接收零个或多个文件名;
  • 若用户输入未知选项,argparse 自动报错并退出,无需手动处理。