在编写 Python 脚本时,经常需要从命令行(如 Terminal 或 CMD)向脚本传递参数。很多人可能用过 sys.argv,但它既原始又麻烦。

argparse 是 Python 标准库中推荐的命令行解析模块。它能做三件大事:

  1. 定义 (Define):清晰地定义脚本需要哪些参数,以及它们是什么类型;

  2. 解析 (Parse):自动从命令行读取并解析用户传入的参数;

  3. 帮助 (Help):自动生成格式精美的帮助信息(当用户使用 -h--help 时),并能在用户输入错误时自动报错。


一、argparse 的三步走黄金法则

使用 argparse 非常有规律,记住这三个步骤就掌握了 80%:

  1. import argparse

  2. parser = argparse.ArgumentParser():创建解析器

  3. parser.add_argument():(可多次调用) 添加想接收的参数

  4. args = parser.parse_args():执行解析并获取结果

# 黄金三步
import argparse

# 1. 创建解析器 (可以加个描述)
parser = argparse.ArgumentParser(description="这是一个示例脚本")

# 2. 添加参数 (添加了两个参数)
parser.add_argument("filename", help="要处理的文件名")
parser.add_argument("-v", "--verbose", action="store_true", help="显示详细信息")

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

# --- 现在,你可以使用这些参数了 ---
print(f"要处理的文件是: {args.filename}")
if args.verbose:
    print("详细模式已开启")

二、argparse 的两大参数类型

argparse 中的参数分为两大类,理解这个区别至关重要

1. 位置参数 (Positional Arguments)

位置参数是必须提供的参数,它们没有前缀(如 ---),并且顺序很重要

  • 定义方式:参数名- 开头。

  • 特点:默认情况下,它们是 必需的 (required)

  • 示例:在 cp old.txt new.txt 命令中,old.txtnew.txt 都是位置参数。

代码示例:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("filename", help="要处理的文件名") 
args = parser.parse_args()

print(f"文件名是: {args.filename}")
  • 如何运行 (在终端里):

    # 正确运行
    python your_script.py data.csv 
    # 输出: 文件名是: data.csv
    
    # 错误运行 (没有提供必需的参数)
    python your_script.py
    # 报错: the following arguments are required: filename
    
2. 可选参数 (Optional Arguments)

可选参数(也叫选项或标志)是可有可无的参数,它们必须-(短选项)或 --(长选项)开头。

  • 定义方式:参数名以 --- 开头。

  • 特点:默认是可选的 (optional),顺序不重要。

它们又分为两种常见用法:

A) 开关/标志 (Flags) - action="store_true"

这种参数不接收值,它的存在本身就代表一个含义(通常是 True)。

  • 代码示例

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("-v", "--verbose", 
                        action="store_true", 
                        help="开启详细模式")
    args = parser.parse_args()
    
    if args.verbose:
        print("详细模式已开启")
    else:
        print("详细模式已关闭")
    
  • 如何运行 (在终端里):

    # 不提供 -v
    python your_script.py
    # 输出: 详细模式已关闭 (args.verbose 默认为 False)
    
    # 提供 -v
    python your_script.py -v
    # 输出: 详细模式已开启 (args.verbose 变为 True)
    

B) 带值的选项 (Options with values)

这种参数需要提供一个跟随它的值(比如文件名、数字等)。

  • 代码示例

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("-o", "--output", help="指定输出文件名")
    args = parser.parse_args()
    
    if args.output:
        print(f"结果将保存到: {args.output}")
    else:
        print("未指定输出文件")
    
  • 如何运行 (在终端里):

    # 不提供
    python your_script.py
    # 输出: 未指定输出文件 (args.output 默认为 None)
    
    # 提供
    python your_script.py --output results.txt
    # 输出: 结果将保存到: results.txt
    
    # 短选项也可以
    python your_script.py -o results.txt
    # 输出: 结果将保存到: results.txt
    

三、add_argument() 的常用“魔法”

add_argument() 方法是 argparse 的灵魂,它有很多强大的参数:

  • help

    • help="显示帮助信息"

    • 在用户运行 python script.py -h 时显示。

  • action

    • action="store_true": 如果提供了该参数,值存为 True,否则为 False

    • action="store_false": 相反,如果提供了该参数,值存为 False,否则为 True

  • type: 限制参数的类型

    • type=int: 自动将用户输入转换为整数。如果输入 abcargparse 会自动报错。

    • type=float: 转换为浮点数。

    • 示例: parser.add_argument("-n", "--number", type=int)

  • default: 设置默认值

    • default=Nonedefault=10

    • 如果用户没有提供这个可选参数,args 对象中的值就会是这个 default 值。

    • 示例: parser.add_argument("-o", "--output", default="default.txt")

  • required: 让“可选参数”变为“必需”

    • required=True

    • 默认情况下,可选参数(带 - 的)都是可选的。但有时希望一个参数必须带前缀(如 --config),又必须提供。

    • 示例: parser.add_argument("-c", "--config", required=True, help="必须提供配置文件")

  • choices: 限制可选的范围

    • choices=["A", "B", "C"]

    • 如果用户输入了不在这个列表中的值,argparse 会自动报错。

    • 示例: parser.add_argument("--mode", choices=["dev", "prod"], default="dev")


四、综合实战演练

写一个“完整”的脚本,它同时使用位置参数和可选参数。

需求:写一个脚本,它接收一个必需的输入文件名(位置参数),一个可选的输出文件名(可选参数,--output),和一个可选的重复次数(可选参数,--repeat,必须是整数,默认为 1)。文件名:main.py

import argparse

# 1. 创建解析器
parser = argparse.ArgumentParser(description="一个处理文件的示例脚本")

# 2. 添加参数
# --- 位置参数 ---
parser.add_argument("input_file", 
                    help="必需的输入文件名")

# --- 可选参数 ---
parser.add_argument("-o", "--output", 
                    default="output.txt", 
                    help="可选的输出文件名 (默认: output.txt)")

parser.add_argument("-r", "--repeat", 
                    type=int, 
                    default=1, 
                    help="重复的次数 (默认: 1)")

parser.add_argument("-v", "--verbose", 
                    action="store_true", 
                    help="开启详细模式")

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

# --- 使用参数 ---
print("--- 开始执行脚本 ---")
print(f"输入文件: {args.input_file}")
print(f"输出文件: {args.output}")
print(f"重复次数: {args.repeat}")
if args.verbose:
    print("详细模式已开启!")
print("--- 脚本执行完毕 ---")

在终端中运行它:

运行 1:(只提供必需参数)

Bash

python main.py data.log

输出:

--- 开始执行脚本 ---
输入文件: data.log
输出文件: output.txt
重复次数: 1
--- 脚本执行完毕 ---

运行 2:(使用所有参数)

Bash

python main.py contacts.csv -o results.csv --repeat 5 -v

输出:

--- 开始执行脚本 ---
输入文件: contacts.csv
输出文件: results.csv
重复次数: 5
详细模式已开启!
--- 脚本执行完毕 ---

运行 3:(查看自动生成的帮助)

Bash

python main.py -h

输出:

usage: main.py [-h] [-o OUTPUT] [-r REPEAT] [-v] input_file

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐