Используйте argparse для запуска 1 из 2 функций в моем скрипте - PullRequest
0 голосов
/ 09 февраля 2011

У меня в настоящее время есть 2 функции в моем скрипте .py.

# 1 подключается к базе данных и выполняет некоторую обработку.

# 2 выполняет некоторую другую обработку файлов

В настоящее время, прежде чем запустить скрипт, я должен вручную закомментировать / раскомментировать функцию, которую я хочу запустить в моем main if блоке оператора.

Как я могу использовать argparse, чтобы он спрашивал меня, какую функцию запустить при запуске моего скрипта?

Ответы [ 3 ]

3 голосов
/ 09 февраля 2011

Можно сообщить объектам 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'
2 голосов
/ 09 февраля 2011

Если это просто флаг запуска 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()

edit : чтобы обработать целочисленный аргумент, вы просто должны указать тип

>>> 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 для значения, если вы выберете в этом примере.

0 голосов
/ 09 февраля 2011

Вы можете использовать для этого ткань.

...