【问题标题】:Python Command Line Arguments: Calling a functionPython 命令行参数:调用函数
【发布时间】:2015-08-20 12:30:34
【问题描述】:

所以我被困在一个我正在从事的项目中,该项目涉及 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 中有两个模块,称为 argparseoptparse,但我很难理解这两个模块,我不确定这两个模块中的任何一个是否能够完成我需要做的事情。

【问题讨论】:

  • 从学习的角度来看,我建议首先直接从sys.argv 获取您的信息。您可以使用一系列if 语句或字典调度。如果您需要添加更多选项,请花时间学习argparse。您的问题非常适合 subparsers 模型。

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


【解决方案1】:

使用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

【讨论】:

    【解决方案2】:

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

    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
    

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

    【讨论】:

      【解决方案3】:
      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)
      

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

      【讨论】:

        【解决方案4】:

        Execute function via arg

        正如接受的答案中所述,您可以(ab?)使用add_argumenttype 参数来执行函数。

        import argparse
        
        parser = argparse.ArgumentParser()
        parser.add_argument('option2', type=interface.do_option2)
        
        args = parser.parse_args()
        

        【讨论】:

        • 很好的起点,但我认为最好使用sub commands(如倒数第二个示例所示)。
        【解决方案5】:

        如果你想直接传入参数而不使用标签,你可以使用 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

        【讨论】:

        • 嗨!感谢您的回复。所以在我的主要功能中,我有, interface = Interface() interface.prompt(">") interface.cmdloop("Starting prompt...") Interface 是具有功能的类。所以使用 sys.argv 我可以调用某个函数并同时传递这些参数?
        • 只需使用 if 语句来决定调用哪个函数:if sys.argv[1]=='option3':
        • sys.argv 包含所有命令行元素,因此您可以从中解析任何作为参数添加到命令行的内容
        猜你喜欢
        • 2017-01-08
        • 2017-06-08
        • 2013-01-13
        • 1970-01-01
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-03
        相关资源
        最近更新 更多