У меня есть программа, которая должна иметь возможность либо протестировать список идентификаторов серверов. ИЛИ выдать команду на сервер.Это значит, что если я выдаю --test
, то больше ничего не требуется.Он запускает всю гамму тестов на каждом сервере и печатает результаты.
Однако, если я НЕ УКАЗУЮ --test
, тогда потребуется несколько параметров, таких как --id
и --command
.
Однако я не уверен, что argparse
может обрабатывать обязательные опции во взаимоисключающих группах.Код (модифицированный для простоты) выглядит следующим образом.Я изменил параметры, поэтому, если вы укажете -a
, тогда вам НЕОБХОДИМО пройти, и никакие другие параметры не понадобятся.
import argparse
parser = argparse.ArgumentParser()
test_or_not = parser.add_mutually_exclusive_group(required=True)
test_or_not.add_argument('-a', action='store_true')
or_not = test_or_not.add_argument_group()
target = or_not.add_mutually_exclusive_group(required=True)
target.add_argument('-b',action="store_true")
target.add_argument('-c',action="store_true")
target.add_argument('-d',action="store_true")
target.add_argument('-e',action="store_true")
group = or_not.add_mutually_exclusive_group(required=True)
group.add_argument('-f',action="store_true")
group.add_argument('-g',action="store_true")
or_not.add_argument('-i',action="store_true")
or_not.add_argument('-j',action="store_true")
or_not.add_argument('-k',action="store_true")
or_not.add_argument('-l',action="store_true")
args = parser.parse_args()
Полученная ошибка вызвана тем, что argparse
по-прежнему требует отдельноговарианты, даже если они находятся во взаимоисключающей группе.Есть ли способ, которым argparse
может приспособиться к этому набору опций, или мне нужно добавить немного программирования помимо argparse
?
$ python3 ~/tmp/groups.py -a
usage: groups.py [-h] -a (-b | -c | -d | -e) (-f | -g) [-i] [-j] [-k] [-l]
groups.py: error: one of the arguments -b -c -d -e is required
Редактировать: я мог бы добавить новую опцию, которая полностью работаетВНЕ argparse
, как показано ниже, но я бы хотел, чтобы это структурировалось в пределах argparse
, если это вообще возможно.
import argparse
import sys
if '--test' in sys.argv:
go_do_testing()
sys.exit(0)
parser = argparse.ArgumentParser()
<snip>