Как мога да получа име на аргумент от argparse?

Това е моят скрипт на командния ред

import argparse


parser = argparse.ArgumentParser('My command line app')

parser.add_argument('--start', type=start, metavar='HOST', dest='result', nargs='*', default='all', help='Start hosts')
parser.add_argument('--stop', type=stop, metavar='HOST', dest='result', nargs='*', default='all', help='Stop hosts')
parser.add_argument('--status', type=status, metavar='HOST', dest='result', nargs='*', default='all', help='Show hosts status')

args = parser.parse_args()

В момента дефинирах една функция за всяка опция, но бих искал да ги обвия само в една за тези три опции. Тогава ще трябва да знам кой аргумент е бил използван. Възможно ли е с argparse?

Решение

Накрая поех по този начин:

import argparse


def wrapper(command, hosts):
    pass


parser = argparse.ArgumentParser('My script')
parser.add_argument('action', choices=['start', 'stop', 'status'], help='Action')
parser.add_argument('hosts', metavar='HOST', nargs='*', default='all')

args = parser.parse_args()

wrapper(args.action, args.hosts)

person Antonio Romero Oca    schedule 04.09.2015    source източник


Отговори (1)


Звучи като по-разумния начин да се справите с това би бил параметърът choices:

commands = {'start': start, 'stop': stop, 'status': status}

parser = argparse.ArgumentParser('My command line app')
parser.add_argument('command', choices=commands.keys())
parser.add_argument('hosts', nargs='*', default=[])
args = parser.parse_args()

commands[args.command](*args.hosts)
person deceze♦    schedule 04.09.2015
comment
И как мога да получа списъка с хостове за опцията: python commandline.py --status 44.44.44.44 55.55.55.55 - person Antonio Romero Oca; 04.09.2015
comment
Бих ги добавил като отделен параметър, както е актуализиран по-горе. Това променя CLI API на my.py start foo bar baz само с една възможна команда на извикване вместо множество смесени команди в момента, но това ми изглежда много по-разумно. - person deceze♦; 04.09.2015
comment
Трябваше да редактирам команди, защото ми трябва само обвивка за трите опции и накрая да добавя args.command като първи аргумент на функциите. Но отговорът ти е много добър, благодаря! - person Antonio Romero Oca; 04.09.2015