#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"