繁体   English   中英

如何使用 ArgParse 传递调用 function 的参数?

[英]How to pass an argument calling a function using ArgParse?

我正在尝试使用参数调用 function_3,但收到无法识别的错误 arguments。我是这样调用的: python script.py --pass test

import argparse
import sys

def function_1():
    print('Function 1')

def function_2():
    print('Function 2')

def function_3(arg):
    print(f'Function 3 {arg}')

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()
    
    parser_f1 = subparsers.add_parser('fc1', help='Function 1')
    parser_f1.set_defaults(func=function_1)

    parser_f2 = subparsers.add_parser('fc2', help='Function 2')
    parser_f2.set_defaults(func=function_2)

    parser_f3 = subparsers.add_parser('fc3', help='Function 3')
    parser_f3.add_argument("pass", help="function 3 argument")
    parser_f3.set_defaults(func=function_3)
        
    if len(sys.argv) <= 1:
        sys.argv.append('--help')

    options = parser.parse_args()
    options.func()

错误

usage: argtest.py [-h] {fc1,fc2,fc3} ...
argtest.py: error: unrecognized arguments: --arg

首先,您的pass选项仅适用于fc3子解析器,因此您需要的不是python script.py --pass test ,而是:

python script.py fc3 --pass test

但是您定义了位置参数,而不是命令行选项。 您需要像这样调用您的脚本:

python script.py fc3 test

或者您需要修复代码:

parser_f3.add_argument('--pass', help='function 3 argument')

这将允许您运行python script.py fc3 --pass test


代码还有其他问题; 你的function3 function 需要一个参数,但你调用options.func()没有 arguments,这将导致TypeError异常。

我不建议这样做,我个人建议只使用点击,但我想这是一种方法......

import sys
from argparse import ArgumentParser


def parse_args():
    parser = ArgumentParser()
    parser.add_argument(
        "-f", "--function", type=str, help="name of the function to call", default="echo"
    )
    parser.add_argument("func_args", nargs="*")
    return parser.parse_args(args=None if sys.argv[1:] else ["--help"])


def echo(*args):
    print(' '.join(*args))


if __name__ == "__main__":
    args = parse_args()
    eval(f"{args.function}({args.func_args})")

这种方法对我来说是脆弱和错误的,但我相信这符合您要求的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM