argparse с необязательным значением в кавычках «—options —for —other —cmd»

#python #python-3.x

#python #python-3.x

Вопрос:

Мне нужно передать аргументы непосредственно команде, выполняемой в моем скрипте Python. Самому скрипту не нужно оценивать аргументы, которые будут переданы команде, или манипулировать ими.

 ./cookbooks.py vendor -o "--delete"
  

К сожалению, argparse распознает — в строке, заключенной в кавычки, как попытку предоставить необязательный аргумент вместо значения, и возвращается ошибка «ошибка: аргумент -o /—options: ожидается один аргумент». Он считает, что для -o не было предоставлено никакого значения.

Я просто хочу добавить все, что передается, и не препятствовать возможности операторов использовать базовую команду. В приведенном ниже фрагменте предполагается, что options переменная является значением, заключенным в кавычки, чего бы то ни было.

 cmd = ' '.join(["berks", "vendor", dir, options])
subprocess.call(cmd, cwd=entry.path, shell=True)
  

Мой аргумент синтаксического анализа определен следующим образом. Я также пробовал с type=str .

 parser.add_argument("-o", "--options",
                    help="berks vendor or knife cookbook upload options passed directly to the command")
  

Можно ли указать argparse принимать значения в кавычках как есть?

Комментарии:

1. кавычки предназначены для оболочки, python получает необработанные строки

2. Обычно, когда вы прекращаете приводить аргументы к чему-то одному и начинаете предоставлять аргументы, которые должны идти к чему-то, что оно вызывает, вы бы использовали -- .

3. @jonrsharpe, Хотя имейте в виду, что argparse изначально не поддерживает этот шаблон; вам придется вручную манипулировать, sys.argv чтобы разделить аргументы на две группы и передать только первую группу parse_args .

4. @0x5453 Нет, argparse поддерживает -- просто отлично; вам просто нужно определить анализатор, чтобы ожидать позиционные аргументы.

5. @0x5453 Да, это правда

Ответ №1:

С вашим текущим определением вы можете вызвать свой скрипт с

 ./cookbooks.py vendor -o=--delete
  

Поскольку -- не запускает аргумент, argparse не рассматривает его как параметр, только как часть пары имя-значение для разделения = .

Комментарии:

1.Спасибо. Следующие два метода сработали. ./cookbooks.py vendor -o=--delete ./cookbooks.py vendor -o="--delete --something"

2. Я также успешно использовал action =’append’ в определении add_argument и объединил массив в строку. ./cookbooks.py vendor -o=--delete -o=--something .

3. Если вам нужно создать единственную строку, обязательно тщательно задокументируйте это, чтобы пользователь не запутался, -o="--delete foo" -o "--something" создает ли список аргументов с 2 или 3 аргументами.

4. Спасибо. Я решил, что определение аргумента следующим образом будет лучше всего работать для моего приложения. parser.add_argument("-o", "--options", default='', help="arguments passed directly to the command, required format: -o="args", i.e. -o="--delete --only groupa"") . Который печатается как arguments passed directly to the command, required format: -o="args", i.e. -o="--delete --only groupa"