调用Python函数基于命令行参数

问题描述 投票:2回答:5

我有几个功能的脚本:

def a():
   pass

def b():
   pass 

def c():
   pass

其设计将根据命令行参数来调用。我可以创建几个,如果将评估哪些函数语句应该运行:

if args.function == "a":
    a()

elif args.function == "b":
    b()
elif args.function == "c":
    c()

但是,有没有更好的方式来做到这一点?

python
5个回答
3
投票

你可以做像这样一本字典

d = {"a" : a,
     "b" : b}

然后派遣

d[args.function]()

1
投票

也许你正在寻找像click图书馆吗?它可以让你轻松地添加命令行子与装饰。

import click

@click.group()
def cli():
    pass

@cli.command()
def a():
   print("I am a")

@cli.command()
def b():
   print("Je suis b")

if __name__ == '__main__':
    cli()

输出示例:

bash$ ./ick.py --help
Usage: ick.py [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  a
  b

bash$ ./ick.py a
I am a

0
投票

尝试使用eval eval(function_name_passed_as_argument + "()")

def a():
   pass

def b():
   pass 
eval(args.function + "()")  

这并不需要使用if-else逻辑。作为参数传递函数的名字将被直接执行。


0
投票

你让一个字典作为已经指出的那样,但是你打算怎么处理不好的输入?我想创建一个默认的方法和使用方法dict.get

def fallback():
    print('That command does not exist')
    # add any code you want to be run for
    # a bad input here...

functions = {
    'a': a,
    'b': b
}

然后,通过检索它调用的函数:

functions.get(args.function.lower(), fallback)()

0
投票

Python有,我们可以利用例如Argparse,这种方法在Python的命令行可编程应用相当普遍几个内置的功能。基础:

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

通过这种方法,你可以有这样的事情:

$ python3 prog.py -v
verbosity turned on
$ python3 prog.py --help
usage: prog.py [-h] [-v]

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  increase output verbosity
© www.soinside.com 2019 - 2024. All rights reserved.