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



我正试图使用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())

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

来自parse_argsoptionsargparse.Namespace对象。这是一个简单的对象,类似于字典。事实上,vars(options)返回一个字典。

当运行main(与-d一起运行(时,options.action将被设置为常量,一个函数。但请记住,在Python中,函数是第一类对象,可以像数字和字符串一样设置为变量等。要使用该函数,必须"调用"该函数。

options.action()

应该最终调用CCD_ 10。实际上,由于该函数需要一个参数,您应该使用

options.action(options)

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

当然,对于没有指定-d的情况,您必须小心。则options.action将具有默认值(例如None(。如果默认值不是可调用的,那么此调用将产生一个错误。

argparse文档在处理子程序(子命令(的一节中说明了这种操作。我隐约记得有一个教程,它为addmultiply这样的函数设置了一个参数值,创建了一个简单的算术表达式计算器。

命名空间中的值通常是字符串或数字,要使用它们,需要测试字符串的相等性。例如

 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) 

"store_const"操作不带参数(实际上是nargs=0(。它更像store_true。实际上,store_true只是具有default=Falseconst=Truestore_const

你需要的是另一个论点,whick可能发生在-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')

默认操作类型存储一个值(例如,操作="存储",nargs=无(

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函数。正是这个(非默认(值的存在触发了函数调用。

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

最新更新