使用argparse在我的脚本中运行2个函数中的1个

时间:2011-02-08 21:34:10

标签: python argparse

我目前在.py脚本中有两个函数。

#1连接到数据库并进行一些处理。

#2对文件进行一些其他处理

目前在我运行脚本之前,我必须手动注释/取消注释我要在 if语句块中运行的函数。

如何使用argparse,所以当我运行脚本时它会询问我运行哪个函数?

3 个答案:

答案 0 :(得分:3)

可以通过{{1}中的action='store_const'const=<stuff>对,告诉ArgumentParser对象有关于直接所需行为的函数或对象调用,或者使用add_argument()调用(后者在您使用子解析器时最有用)。如果你这样做,你可以在解析后得到的set_defaults()对象上查找你的函数,而不是在全局命名空间中查找它。

作为一个小例子:

parsed_args

然后你可以这样称呼它:

import argparse

def foo(parsed_args):
    print "woop is {0!r}".format(getattr(parsed_args, 'woop'))

def bar(parsed_args):
    print "moop is {0!r}".format(getattr(parsed_args, 'moop'))

parser = argparse.ArgumentParser()

parser.add_argument('--foo', dest='action', action='store_const', const=foo)
parser.add_argument('--bar', dest='action', action='store_const', const=bar)
parser.add_argument('--woop')
parser.add_argument('--moop')

parsed_args = parser.parse_args()
if parsed_args.action is None:
    parser.parse_args(['-h'])
parsed_args.action(parsed_args)

答案 1 :(得分:2)

如果它只是运行A或B的标志,那么一个简单的“store_true”参数应该没问题。

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--run_a_not_b', action='store_true')
_StoreTrueAction(option_strings=['--run_a_not_b'], dest='run_a_not_b', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.parse_args('--run_a_not_b')
>>> parsed_args = parser.parse_args('--run_a_not_b'.split())
>>> if parsed_args.run_a_not_b:
    print "run a"
else:
    print "run b"


run a
>>> parsed_args = parser.parse_args(''.split())
>>> if parsed_args.run_a_not_b:
    print "run a"
else:
    print "run b"


run b

或者如果你想实际传入要调用的函数的名称,你可以这样做(有点hackish):

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--func_to_run', type=str)
_StoreAction(option_strings=['--func_to_run'], dest='func_to_run', nargs=None, const=None, default=None, type=<type 'str'>, choices=None, help=None, metavar=None)
>>> parsed_args = parser.parse_args('--func_to_run my_other_func'.split())
>>> parsed_args.func_to_run
'my_other_func'
>>> f = globals()[parsed_args.func_to_run]
<function my_other_func at 0x011F6670>
>>> f()

编辑:要处理整数参数,只需指定类型

即可
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--run_a_not_b', action='store_true')
>>> parser.add_argument('--func_arg', type=int)
>>> parsed_args = parser.parse_args('--run_a_not_b --arg 42'.split())
>>> parsed_args = parser.parse_args('--run_a_not_b --func_arg 42'.split())
>>> parsed_args
Namespace(func_arg=42, run_a_not_b=True)

因此,如果您在此示例中选择,则可以简单地获取值parsed_args.func_arg

答案 2 :(得分:0)

您可以考虑使用fabric。