Объединение обязательных и необязательных аргументов с подкомандами - PullRequest
0 голосов
/ 27 декабря 2018

Я борюсь с разбором командной строки и argparse, как обрабатывать глобальные переменные, подкоманды и необязательные параметры для этих подкоманд

Я пишу оболочку python3 вокруг python-libvirt для управления моими виртуальными машинами.Оболочка будет обрабатывать создание, удаление, остановку / запуск, снимки и т. Д.

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

# Connection option for all commands:
# ---
# vmman.py [-c hypervisor] (defaults to qemu:///system)

# Generic VM commands:
# ---
# vmman.py show : list all vms, with their state
# vmman.py {up|down|reboot|rm} domain : boots, shuts down, reboots 
or deletes the domain

# Snapshot management:
# ---
# vmman.py lssnap domain : list snapshots attached to domain
# vmman.py snaprev domain [snapsname] : reverts domain to latest 
snapshot or to snapname

# Resource management:
# ---
# vmman.py domain resdel [disk name] [net iface]

А потом какой-то код, используемый для тестирования первой подкоманды:

def setConnectionString(args):
    print('Arg = %s' % args.cstring)

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()

parserConnect = subparsers.add_parser('ConnectionURI')
parserConnect.set_defaults(func=setConnectionString)
parserConnect.add_argument('-c', '--connect', dest='host')

args = parser.parse_args()
args.func(args)
print("COMPLETED")

Теперь документ argparse () на docs.python.org довольно плотный и немного запутывает новичка в Python, как и я ...Я ожидал, что результат будет примерно таким:

`Arg = oslo`

Что я получу:

[10:21:40|jfgratton@bergen:kvmman.py]: ./argstest.py -c oslo
usage: argstest.py [-h] {ConnectionURI} ...
argstest.py: error: invalid choice: 'connectionURI' (choose from 'ConnectionURI')

Я явно что-то пропускаю, и я тестирую только то, что, как я думал,быть самым простым из всех (глобальный параметр);еще даже не понял, как обрабатывать необязательные подпункты и все такое.

1 Ответ

0 голосов
/ 27 декабря 2018

В выводе об ошибке выводится «connectionURI» с недопустимым выбором строчной буквы «c», а также «выбор из« ConnectionURI »» с заглавной буквой «C».

Исправление: вызовите тест с помощью:

. / Argstest.py ConnectionURI oslo

Возможно, вам следует начать с простого (без подпарсеров) и построить оттуда:

import argparse

def setConnectionString(hostname):
    print('Arg = {}'.format(hostname))

parser = argparse.ArgumentParser(description='python3 wrapper around python-libvirt to manage VMs')
parser.add_argument('hostname')

args = parser.parse_args()
setConnectionString(args.hostname)

print("COMPLETED")
...