Python аргумент командной строки, который может быть пустым или из списка выбора - PullRequest
1 голос
/ 25 апреля 2020

Я работаю над сценарием для управления сборками Docker изображений. В настоящее время я поддерживаю один или несколько базовых образов Centos и один или несколько Debian. Я бы хотел, чтобы "--centos" или "--debian" использовались по умолчанию для последней версии. Но если пользователь хочет построить более старую копию, то это должно прийти из списка выбора. Таким образом, я ищу гибрид: parser.add_argument ('- centos', choices = ['centos-6', 'centos-7']) и parser.add_argument ('- centos')

чтобы я мог запустить скрипт как:

python dobuild.py --centos #would build the latest centos in the list

или

python dobuild.py --centos centos-6 #would build the older copy

но

python dobuild.py --centos centos-5 #would return an 'invalid choice' error

Я пытался choices=['centos-6','centos-7',''] и choices=['centos-6','centos-7', []]

для полноты: python dobuild.py --centos --debian #would build the latest centos AND latest debian in the list et c. , .

1 Ответ

3 голосов
/ 25 апреля 2020

Чтобы добавить этот необязательный аргумент по умолчанию, вы можете использовать nargs='?' и const='<default>'. Здесь, в документации

Обратите внимание, что для необязательных аргументов есть дополнительный случай - строка параметра присутствует, но за ней не следует аргумент командной строки. В этом случае будет получено значение из const:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--centos', choices=['centos-6', 'centos-7'], nargs='?', const='centos-7')

Используя этот синтаксический анализатор:

>>> parser.parse_args([])
Namespace(centos=None)
>>> parser.parse_args(['--centos'])
Namespace(centos='centos-7')
>>> parser.parse_args(['--centos', 'centos-6'])
Namespace(centos='centos-6')
...