Use Argparse To Run 1 Of 2 Functions In My Script
Solution 1:
It is possible to tell ArgumentParser objects about the function or object that has your desired behavior directly, by means of action='store_const'
and const=<stuff>
pairs in an add_argument()
call, or with a set_defaults()
call (the latter is most useful when you're using sub-parsers). If you do that, you can look up your function on the parsed_args
object you get back from the parsing, instead of say, looking it up in the global namespace.
As a little example:
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)
And then you can call it like:
% python /tmp/junk.py --foo
woop isNone
% python /tmp/junk.py --foo --woop 8 --moop 17
woop is'8'
% python /tmp/junk.py --bar --woop 8 --moop 17
moop is'17'
Solution 2:
If it's just a flag of run A or B, then a simple "store_true" argument should be fine.
>>> 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
Or if you want to actually pass in the name of the function to call, you can do it this (somewhat hackish) way:
>>> 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()
edit : to handle an integer argument, you would simply specify the type
>>>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)
So, you can simply get parsed_args.func_arg
for the value if you choose in this example.
Solution 3:
You might consider using fabric for this.
Post a Comment for "Use Argparse To Run 1 Of 2 Functions In My Script"