在 Python 中,通过命令行向函数传参是构建可执行脚本、工具或应用程序的重要方式。这种机制允许用户在终端(如 Bash、PowerShell、CMD)中运行脚本时,直接传递参数来控制程序行为,而无需修改代码。
下面从基础到进阶系统讲解这一知识点:
一、为什么需要命令行传参?
- 灵活性:同一个脚本可以处理不同输入(如不同文件、配置)。
- 自动化:便于被其他程序或脚本调用(如 shell 脚本、CI/CD 流程)。
- 用户友好:提供清晰的接口,支持帮助信息、默认值、类型检查等。
二、核心模块:sys.argv(基础方式)
Python 内置模块 sys 提供了最原始的命令行参数访问方式。
示例:
python
# hello.py
import sys
print("脚本名:", sys.argv[0])
print("所有参数:", sys.argv[1:])
if len(sys.argv) > 1:
print("第一个参数:", sys.argv[1])
运行:
bash
python hello.py Alice --verbose
输出:
脚本名: hello.py
所有参数: ['Alice', '--verbose']
第一个参数: Alice
特点:
sys.argv是一个字符串列表。argv[0]是脚本名称,argv[1:]是用户传入的参数。- 缺点 :无类型转换、无帮助信息、无错误提示、需手动解析(如区分
-f file.txt和--output=out.wav)。
✅ 适合极简单的场景;❌ 不推荐用于复杂参数处理。
三、标准推荐:argparse 模块(强大且规范)
argparse 是 Python 官方推荐的命令行参数解析库(自 Python 2.7 / 3.2 起内置)。
基本结构:
python
import argparse
# 1. 创建解析器
parser = argparse.ArgumentParser(description="程序描述")
# 2. 添加参数
parser.add_argument(...)
# 3. 解析参数
args = parser.parse_args()
# 4. 使用参数(args.xxx)
your_function(args.param1, args.param2)
参数类型详解
1. 位置参数(必填)
python
parser.add_argument("input_file", help="输入文件路径")
- 用户必须提供,如:
python script.py data.txt - 通过
args.input_file访问。
2. 可选参数(带 - 或 --)
python
parser.add_argument("-v", "--verbose", action="store_true", help="启用详细输出")
- 可写成
-v或--verbose action="store_true"表示:若出现该参数,则值为True,否则False。
3. 带值的可选参数
python
parser.add_argument("-o", "--output", type=str, default="out.txt", help="输出文件")
parser.add_argument("-n", "--num", type=int, required=True, help="数字参数")
type:自动转换类型(如int,float, 自定义函数)。default:默认值。required=True:强制用户必须提供(仅对可选参数有效)。
4. 多值参数
python
parser.add_argument("--files", nargs="+", help="多个文件") # 至少一个
parser.add_argument("--dirs", nargs="*", help="零个或多个目录")
nargs="+":接收一个或多个值,返回列表。- 使用:
--files a.txt b.txt c.txt
完整示例
python
# process.py
import argparse
def process_data(input_file, output_file, threshold, verbose):
if verbose:
print(f"Processing {input_file} with threshold={threshold}")
# ... 实际处理逻辑
print(f"Saved to {output_file}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="数据处理工具")
parser.add_argument("input", help="输入文件")
parser.add_argument("-o", "--output", default="result.txt", help="输出文件")
parser.add_argument("-t", "--threshold", type=float, default=0.5, help="阈值")
parser.add_argument("-v", "--verbose", action="store_true", help="详细模式")
args = parser.parse_args()
process_data(
input_file=args.input,
output_file=args.output,
threshold=args.threshold,
verbose=args.verbose
)
使用:
bash
python process.py data.csv -o out.csv -t 0.8 -v
四、高级技巧
1. 子命令(Subcommands)
适用于类似 git commit、git push 的多命令工具:
python
subparsers = parser.add_subparsers(dest="command")
commit_parser = subparsers.add_parser("commit")
commit_parser.add_argument("-m", "--message")
2. 自定义类型或验证
python
def positive_int(value):
ivalue = int(value)
if ivalue <= 0:
raise argparse.ArgumentTypeError("必须是正整数")
return ivalue
parser.add_argument("--count", type=positive_int)
3. 互斥参数组
python
group = parser.add_mutually_exclusive_group()
group.add_argument("--quiet", action="store_true")
group.add_argument("--verbose", action="store_true")
# 用户不能同时使用 --quiet 和 --verbose
五、最佳实践
-
始终使用
if __name__ == "__main__":避免导入时执行命令行逻辑。
-
提供清晰的
help和description用户可通过
python script.py -h查看用法。 -
设置合理的默认值
减少用户输入负担。
-
使用
type做类型转换和校验避免在函数内部做字符串转数字等操作。
-
参数命名清晰
如
--input-file比-i更易读(但可同时提供短选项-i)。


六、替代方案(了解即可)
click:第三方库,更简洁,适合构建 CLI 应用。fire:Google 开源,自动将任意函数暴露为命令行接口。typer:基于类型提示的现代 CLI 构建工具(支持自动生成帮助、shell 补全等)。
但对大多数场景,argparse 已足够强大且无需额外依赖。
总结
| 方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
sys.argv |
简单、无依赖 | 无类型、无帮助、难维护 | 极简单脚本 |
argparse |
功能全、标准库、用户友好 | 代码稍多 | 绝大多数场景 |
click/typer |
更简洁、现代化 | 需安装第三方库 | 复杂 CLI 工具 |
掌握 argparse 是 Python 开发者必备技能,能让你的脚本从"玩具"变成"工具"。