You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用argparse将Python脚本特定命令行参数关联至对应函数?

解决方案:命令行调用指定Python函数并传递参数

我来帮你搞定这个问题,分两种实用方案来说明,覆盖你尝试过的两种思路:

一、快速方案:直接用sys.argv传递参数

你之前的代码问题在于没有把后续的命令行参数传递给函数,只调用了函数但没传参。只需要调整一下调用逻辑,用*解包参数列表就行:

修正后的代码

import sys

def util1(x, y):
    assert(x is not None)
    assert(y is not None)
    print(f"util1 被调用,参数x={x}, y={y}")

def util2(x, y):
    assert(x is not None)
    assert(y is not None)
    print(f"util2 被调用,参数x={x}, y={y}")

def util3(x, y):
    assert(x is not None)
    assert(y is not None)
    print(f"util3 被调用,参数x={x}, y={y}")

if __name__ == '__main__':
    # 检查是否传入了函数名和参数
    if len(sys.argv) < 3:
        print("用法:python3 myscript.py <函数名> <参数1> <参数2>")
        sys.exit(1)
    
    func_name = sys.argv[1]
    args = sys.argv[2:]  # 获取函数名之后的所有参数
    
    try:
        # 用*解包参数列表,把每个元素作为单独参数传给函数
        globals()[func_name](*args)
    except KeyError:
        print(f"错误:不存在名为 {func_name} 的函数")
        sys.exit(1)
    except TypeError as e:
        print(f"错误:参数不匹配 - {e}")
        sys.exit(1)

测试命令

python3 myscript.py util1 1 99999
# 输出:util1 被调用,参数x=1, y=99999

这里的*args会把列表sys.argv[2:]里的每个元素拆成单独的位置参数,完美匹配你的函数需要两个参数的要求。另外加了错误处理,避免输入错误时直接崩溃。


二、更规范的方案:用argparse子命令

如果你的函数参数更复杂(比如需要指定参数名、类型校验),argparse的**子命令(subparsers)**是更专业的选择,能让你的命令行接口更清晰,还能自动生成帮助文档。

完整代码示例

import argparse

def util1(lower, upper):
    print(f"执行util1,范围:{lower} 到 {upper}")

def util2(x, y):
    print(f"执行util2,参数:x={x}, y={y}")

def util3(lower, upper):
    print(f"执行util3,范围:{lower} 到 {upper}")

if __name__ == '__main__':
    # 创建主解析器
    parser = argparse.ArgumentParser(description='调用指定的工具函数')
    
    # 创建子命令解析器
    subparsers = parser.add_subparsers(dest='command', required=True, help='要调用的函数名')
    
    # 为util1添加子命令和参数
    parser_util1 = subparsers.add_parser('util1', help='调用util1函数')
    parser_util1.add_argument('-lc', '--lower_create', type=int, required=True, help='util1的下限值')
    parser_util1.add_argument('-uc', '--upper_create', type=int, required=True, help='util1的上限值')
    
    # 为util2添加子命令和参数(这里用位置参数示例)
    parser_util2 = subparsers.add_parser('util2', help='调用util2函数')
    parser_util2.add_argument('x', type=str, help='util2的第一个参数')
    parser_util2.add_argument('y', type=str, help='util2的第二个参数')
    
    # 为util3添加子命令和参数
    parser_util3 = subparsers.add_parser('util3', help='调用util3函数')
    parser_util3.add_argument('-lr', '--lower_reserve', type=int, required=True, help='util3的下限值')
    parser_util3.add_argument('-ur', '--upper_reserve', type=int, required=True, help='util3的上限值')
    
    # 解析参数
    args = parser.parse_args()
    
    # 根据子命令调用对应函数
    if args.command == 'util1':
        util1(args.lower_create, args.upper_create)
    elif args.command == 'util2':
        util2(args.x, args.y)
    elif args.command == 'util3':
        util3(args.lower_reserve, args.upper_reserve)

测试命令

# 调用util1
python3 myscript.py util1 -lc 10 -uc 20
# 输出:执行util1,范围:10 到 20

# 调用util3
python3 myscript.py util3 -lr 100 -ur 200
# 输出:执行util3,范围:100 到 200

# 查看帮助
python3 myscript.py -h
# 或者查看单个函数的帮助
python3 myscript.py util1 -h

这种方式的好处是:

  • 自动生成清晰的帮助文档,用户能知道每个函数需要什么参数
  • 自动做参数类型校验(比如type=int会把输入转成整数,输入非数字会报错)
  • 参数可以用命名参数(比如-lc)或者位置参数,灵活度更高

内容的提问来源于stack exchange,提问作者dot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:54:53