Python命令行参数:调用函数

时间:2015-06-05 14:01:51

标签: python command-line command-line-arguments argparse optparse

所以我一直坚持我正在研究的一个涉及python命令行的项目。

所以基本上,这就是我想要完成的事情:

我在一个类中有一组函数,比如说,

def do_option1(self, param1, param2) :
    #some python code here

def do_option2(self, param1): 
    #some python code here

def do_option3(self, param1, param2, param3):
    #some python code here

基本上,当用户将filename.py option2 param1放入命令行时,我希望它调用函数do_option2并将参数param1传递给它。

类似地,当用户放置filename.py option3 param1 param2 param3时,我希望它使用给定的参数执行do_option3函数。

我知道python中有2个名为argparseoptparse的模块,但我很难理解这两个模块,我不确定两者中是否有一个会完成我需要做的事情。

5 个答案:

答案 0 :(得分:8)

使用argparse子命令解析器

p = argparse.ArgumentParser()
subparsers = p.add_subparsers()

option1_parser = subparsers.add_parser('option1')
# Add specific options for option1 here, but here's
# an example
option1_parser.add_argument('param1')
option1_parser.set_defaults(func=do_option1)

option2_parser = subparsers.add_parser('option2')
# Add specific options for option1 here
option2_parser.set_defaults(func=do_option2)

option3_parser = subparsers.add_parser('option3')
# Add specific options for option3 here
option3_parser.set_defaults(func=do_option3)

args = p.parse_args()
args.func(args)

然后,需要稍微重写每个do_option函数以获取一个参数,从中可以提取所需的值。例如:

def do_option1(args):
    param1 = args.param1
    # And continue

答案 1 :(得分:4)

我使用这个可以帮助你的模板。

import argparse

parser = argparse.ArgumentParser()

parser.add_argument('--option1', help='description for option1')
parser.add_argument('--option2', help='description for option2')
parser.add_argument('--option3', help='description for option3')

args = parser.parse_args()

if args.option1:
    ...do something

if args.option2:
    ...do something

if args.option3:
    ...do something

然后,您可以运行脚本,传递如下参数:

python script.py --option1 my-option1 --option3 my-option3 --option2 my-option2

请注意,参数的位置并不重要,因为您在其值之前指定了参数的名称。

答案 2 :(得分:2)

options = {
    'option_1': my_class.option_1,
    'option_2': my_class.option_2,
    'option_3': my_class.option_3,
}

option, params = sys.argv[0], sys.argv[1:]
options[option](*params)

应该做的伎俩。您可能希望添加一些检查以确保用户至少向您的脚本传递一些参数。

答案 3 :(得分:1)

Execute function via arg

如接受的答案中所述,您可以(ab?)使用type的{​​{1}}参数来执行函数。

add_argument

答案 4 :(得分:0)

如果你想直接传递参数而不使用标签,你可以只使用sys模块:sys.argv将为['filename.py', 'option3', 'param1', 'param2', 'param3']的命令行提供filename.py option3 param1 param2 param3

http://www.tutorialspoint.com/python/python_command_line_arguments.htm