Python 中通过命令行向函数传参

在 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 commitgit 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

五、最佳实践

  1. 始终使用 if __name__ == "__main__":

    避免导入时执行命令行逻辑。

  2. 提供清晰的 helpdescription

    用户可通过 python script.py -h 查看用法。

  3. 设置合理的默认值

    减少用户输入负担。

  4. 使用 type 做类型转换和校验

    避免在函数内部做字符串转数字等操作。

  5. 参数命名清晰

    --input-file-i 更易读(但可同时提供短选项 -i)。


六、替代方案(了解即可)

  • click:第三方库,更简洁,适合构建 CLI 应用。
  • fire:Google 开源,自动将任意函数暴露为命令行接口。
  • typer:基于类型提示的现代 CLI 构建工具(支持自动生成帮助、shell 补全等)。

但对大多数场景,argparse 已足够强大且无需额外依赖


总结

方式 优点 缺点 适用场景
sys.argv 简单、无依赖 无类型、无帮助、难维护 极简单脚本
argparse 功能全、标准库、用户友好 代码稍多 绝大多数场景
click/typer 更简洁、现代化 需安装第三方库 复杂 CLI 工具

掌握 argparse 是 Python 开发者必备技能,能让你的脚本从"玩具"变成"工具"。

相关推荐
墨染天姬1 小时前
【AI】TensorFlow 框架
人工智能·python·tensorflow
yujunl1 小时前
Net Core8项目不能正常发布
开发语言
lly2024061 小时前
JavaScript Window History
开发语言
智能工业品检测-奇妙智能2 小时前
如何用OpenClaw实现CSDN文章编辑发布
前端·人工智能·chrome·奇妙智能
jianfeng_zhu2 小时前
用java解决空心金字塔的问题
java·开发语言·python
敲代码的嘎仔2 小时前
Java后端开发——Redis面试题汇总
java·开发语言·redis·学习·缓存·面试·职场和发展
天若有情6732 小时前
【原创发布】typechecker:一款轻量级 JS 模板化类型检查工具
开发语言·javascript·npm·ecmascript·类型检查·typechecker
实心儿儿2 小时前
C++ —— 继承
开发语言·c++
佛系豪豪吖2 小时前
OpenClaw(龙虾)彻底卸载教程|Windows+Mac通用,3步无残留
开发语言