将参数传递给main,调用python中的函数

时间:2015-08-25 21:06:02

标签: python-2.7 argparse

我正在尝试使用argparse将参数传递给我的python脚本,从而调用函数。我可能会出错的任何想法?

def parse_args():
      parser = argparse.ArgumentParser()
      parser.add_argument('-d','--d', dest='action', action='store_const',const=do_comparison, 
                        help="Diff the current and most recent map file memory information)")   

      options = parser.parse_args()

      return options

def do_comparison(parsed_args):
    # do things


def main(args):    
    options = parse_args()

if __name__ == '__main__':
    sys.exit(main())

1 个答案:

答案 0 :(得分:1)

在我的评论中,我错过了您使用store_constconst=do_comparison这一事实。所以你正在尝试某种回调。

来自options

parse_argsargparse.Namespace个对象。这是一个简单的对象,类似于字典。实际上vars(options)会返回一个字典。

运行main时(使用-d),options.action将设置为const,即函数。但请记住,在Python中,函数是第一类对象,可以像数字和字符串一样设置为变量等。要使用该功能必须被称为'。

options.action()

最终应该调用do_comparison。实际上因为该函数需要参数,所以你应该使用

options.action(options)

或为函数提供变量或对象的其他方式。

当然,在您未指定-d的情况下,您必须要小心。然后options.action将具有默认值(例如None)。如果默认值不是可调用的,则此调用将产生错误。

argparse文档在处理subparsers(子命令)的部分中说明了这种操作。我含糊地回忆起一个教程,它为addmultiply等函数设置了一个参数值,创建了一个简单的算术表达式求值器。

通常命名空间中的值是字符串或数字,并且要使用它们来测试字符串相等性。 e.g。

 if options.action is None:
     # default action
 elif options.action == 'print':
     print(options)
 else:
     do some other backup or error

回调类型的操作是可能的,在某些情况下可能很方便,但它不是通常的安排。

您询问了如何使用successfully store a string following the -d, to be used as the function arg

parser.add_argument('-d','--d', dest='action', dest='function_input', action='store_const', const=diff_map) 

A' store_const'动作不参与(实际上nargs=0)。它更像store_true。实际上,store_true只是store_const,其中包含default=Falseconst=True

你需要的是另一个论点,可以在-d之前或之后发生。 argparse试图灵活订购。

这是一个带有可调参数和灵活位置参数的简单脚本。

import argparse
def action1(*args):
 print 'action1',args
def action0(*args):
 print 'action0',args

parser = argparse.ArgumentParser()
parser.add_argument('-d', dest='action', action='store_const', const=action1, default=action0)
parser.add_argument('args', nargs='*')
args = parser.parse_args()
args.action(args.args)

结果运行

1238:~/mypy$ python stack32214076.py 
action0 ([],)
1238:~/mypy$ python stack32214076.py one two three
action0 (['one', 'two', 'three'],)
1238:~/mypy$ python stack32214076.py one two three -d
action1 (['one', 'two', 'three'],)
1239:~/mypy$ python stack32214076.py -d one two three
action1 (['one', 'two', 'three'],)
1239:~/mypy$ python stack32214076.py -d
action1 ([],)

要使-d value对值执行某些操作,请尝试:

parser.add_argument('-d','--action')

默认操作类型存储一个值(例如action =' store',nargs = None)

args = parser.parse_args()
if args.action:  # or is not None
     do_comparison(args.action)

如果未-d,则args.action将具有默认None值,此处不会发生任何事情。

如果-d astr被赋予acts.action,则字符串值为'astr'。此if只使用此值调用do_comparison函数。它是触发函数调用的此(非默认)值的当前值。

这是解析器和参数的相当直接的使用。