Используйте parser.parse_args () с nargs и args вместо ввода из командной строки - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть argparse аргумент example, который принимает переменное количество строк:

parser.add_argument('--example', nargs='*', required=False, default='')

Это нормально работает при использовании CLI как обычно с вводом командной строки: script.py --example ab cd.

Я также хочу, чтобы это работало с аргументами, которые передаются parser.parse_args(args) через args аргумент из кода программы.

Но когда я пытаюсь передатьparser.parse_args(["--example", "ab cd"]), он интерпретируется как одна строка "ab cd", а не как список ab и cd.

Аналогично, передача parser.parse_args(["--example", "ab", "cd"]) так или иначе интерпретируется как один аргумент, который является списком.Итак, при доступе к args.example[0] я получаю список, а args.example[1] выдает мне ошибку.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Как показывает ваша ссылка, вы можете дать parse_args список строк.

In [210]: parser = argparse.ArgumentParser()
In [211]: parser.add_argument('-i','--image_types', nargs='*', default='');

Чтобы проверить синтаксический анализ без аргументов командной строки, предоставив ему пустой список:

In [212]: parser.parse_args([])
Out[212]: Namespace(image_types='')

Со списком строк:

In [213]: parser.parse_args(['-i','a','b'])
Out[213]: Namespace(image_types=['a', 'b'])

или разделить строку:

In [214]: parser.parse_args('-i a b'.split())
Out[214]: Namespace(image_types=['a', 'b'])

Ответы на вопросы argparse часто используют одну из этих форм для иллюстрации своих действий.split удобно.

Также возможно создать пространство имен args напрямую:

In [215]: argparse.Namespace(image_types=['a','b','c'])
Out[215]: Namespace(image_types=['a', 'b', 'c'])

Я не следую вашей интерпретации результата для

parser.parse_args(["--example", "ab", "cd"])

Это должно привести к args.example, то есть ["ab", "cd"].

Это не очень хороший тестовый пример:

parser.parse_args(["--example", "ab cd"])

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

python --example "ab cd"

Кавычки переопределяют нормальное разделение на пустое пространство.Вы должны использовать shlex.split для эмуляции этого поведения.

0 голосов
/ 06 февраля 2019

Для argparse сложно обрабатывать списки напрямую, вместо этого используйте список csv:

parser.add_argument('--image_types', \
  help='csv list of imagetypes', \
  default='iff,gif,jpeg,png', default=None)

if args.image_types:
  args.image_types = args.image_types.split(',')
...