Я сталкиваюсь с проблемой в argparse, когда я смешиваю позиционные аргументы, необязательные аргументы и argparse.REMAINDER

parser = argparse.ArgumentParser()
parser.add_argument('verbose', action="store")
parser.add_argument('--config', '-c', nargs="?", dest="config_file")
parser.add_argument('--dry-run', action="store_true", dest="dryrun")
parser.add_argument('args', nargs=argparse.REMAINDER, action="store")

Пробный запуск:

python test.py verose="5" --config config.xml graph --dry-run

Ожидаемый результат:

verbose = "5"
config_file = config.xml
dryrun = True
args = ['graph']

Фактический выход:

verbose = "5"
config_file = config.xml
dryrun = False
args = ['graph', '--dry-run']

Мое требование: у меня есть verbose, -c, --config и --dry-run в качестве параметров командной строки, а любые другие параметры, представленные в командной строке, должны быть сохранены в списке args независимо от порядка появления аргументов в командной строке. Помогите, пожалуйста, где я делаю не так. Также есть ли другой лучший парсер командной строки для Python?

3
Vinay Surve 23 Мар 2013 в 09:54

1 ответ

Лучший ответ

Я бы сказал, что вам нужна следующая конфигурация:

    parser.add_argument('--verbose', action="store")
    parser.add_argument('-c', '--config', nargs="?", dest="config_file")
    parser.add_argument('--dry-run', action="store_true", dest="dryrun")
    parser.add_argument('args', nargs='*')

Я думаю, что аргумент «REMAINDER», который вы указали, конкретно указывает модулю argparse принимать остальные аргументы в args, когда он находит первый аргумент, он не может соответствовать остальным.

Если вам нужно 0 или более аргументов для args, используйте '*', если вы хотите хотя бы 1 аргумент, используйте '+' в качестве аргумента nargs.

Помимо этого, я бы порекомендовал документацию argparse, поскольку есть много возможностей для уже разобраны с нужным типом (например, int или аргументы файла). Также создание модуля CLI-argparse в бесплатной Aptana Studio обеспечивает хорошую оболочку для argparse с уже установленными некоторыми стандартными аргументами (например, подробный). Verbose в этом случае будет целым числом.

5
michael_s 23 Мар 2013 в 10:09
Думаю, мой вопрос был очень глупым !! Но большое спасибо. Ваш ответ решил мою проблему :)
 – 
Vinay Surve
23 Мар 2013 в 10:09
Задавать вопросы никогда не бывает глупо (конечно, нужно приложить немного усилий для исследования, прежде чем задавать вопросы). См. Также мой дополнительный комментарий в ответе.
 – 
michael_s
23 Мар 2013 в 10:10