我的 .py 脚本中目前有 2 个函数。
#1 连接到数据库并进行一些处理。
#2 对文件进行一些其他处理
目前在我运行脚本之前,我必须手动注释/取消注释我想在我的主if 语句块中运行的函数。
我如何使用 argparse,所以当我运行脚本时它会询问我要运行哪个函数?
可以直接告诉 ArgumentParser 对象有关具有所需行为的函数或对象,通过调用中的action='store_const'
和const=<stuff>
配对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)
然后你可以这样称呼它:
% python /tmp/junk.py --foo
woop is None
% python /tmp/junk.py --foo --woop 8 --moop 17
woop is '8'
% python /tmp/junk.py --bar --woop 8 --moop 17
moop is '17'
如果它只是运行 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
或者,如果您想实际传递要调用的函数的名称,您可以这样做(有点骇人听闻)的方式:
>>> 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
如果您在此示例中选择,您可以简单地获取该值。
您可以考虑为此使用织物。