Python argparse 详解:让脚本更专业
在编写 Python 脚本时,经常需要从命令行(如 Terminal 或 CMD)向脚本传递参数。很多人可能用过 sys.argv,但它既原始又麻烦。
argparse 是 Python 标准库中推荐的命令行解析模块。它能做三件大事:
-
定义 (Define):清晰地定义脚本需要哪些参数,以及它们是什么类型;
-
解析 (Parse):自动从命令行读取并解析用户传入的参数;
-
帮助 (Help):自动生成格式精美的帮助信息(当用户使用
-h或--help时),并能在用户输入错误时自动报错。
一、argparse 的三步走黄金法则
使用 argparse 非常有规律,记住这三个步骤就掌握了 80%:
-
import argparse -
parser = argparse.ArgumentParser():创建解析器 -
parser.add_argument():(可多次调用) 添加想接收的参数 -
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.txt和new.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: 自动将用户输入转换为整数。如果输入abc,argparse会自动报错。 -
type=float: 转换为浮点数。 -
示例:
parser.add_argument("-n", "--number", type=int)
-
-
default: 设置默认值-
default=None或default=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:(只提供必需参数)
Bashpython main.py data.log输出:
--- 开始执行脚本 --- 输入文件: data.log 输出文件: output.txt 重复次数: 1 --- 脚本执行完毕 ---
运行 2:(使用所有参数)
Bashpython main.py contacts.csv -o results.csv --repeat 5 -v输出:
--- 开始执行脚本 --- 输入文件: contacts.csv 输出文件: results.csv 重复次数: 5 详细模式已开启! --- 脚本执行完毕 ---
运行 3:(查看自动生成的帮助)
Bashpython main.py -h输出:
usage: main.py [-h] [-o OUTPUT] [-r REPEAT] [-v] input_file
更多推荐

所有评论(0)