我目前在.py脚本中有两个函数。
#1连接到数据库并进行一些处理。
#2对文件进行一些其他处理
目前在我运行脚本之前,我必须手动注释/取消注释我要在主 if语句块中运行的函数。
如何使用argparse,所以当我运行脚本时它会询问我运行哪个函数?
答案 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。