Почему getopt не работает, если sys.argv передан полностью?
Если я использую это с getopt
:
import getopt
import sys
opts,args = getopt.getopt(sys.argv,"a:bc")
print opts
print args
opts
будет пустым. Кортежи не будут созданы. Однако если я буду использовать sys.argv[1:]
все работает как положено. Я не понимаю, почему это так. Кто-нибудь хочет объяснить?
2 ответа
Первый элемент sys.argv
(sys.argv[0]
) - имя скрипта, выполняемого в данный момент. Поскольку это имя сценария (вероятно) не является допустимым аргументом (и, вероятно, не начинается с -
или же --
тем не мение), getopt
не признает это как аргумент. Из-за характера того, как getopt
работает, когда он видит что-то, что не является флагом командной строки (то, что не начинается с -
или же --
), он останавливает обработку параметров командной строки (и помещает остальные аргументы в args
), поскольку предполагается, что остальные аргументы являются элементами, которые будут обрабатываться программой (например, имена файлов или другие "обязательные" аргументы).
Это по замыслу. Напомним, что sys.argv[0] - это имя запущенной программы, а getopt не хочет его.
Из документов:
Разбирает параметры командной строки и список параметров. args - список аргументов, который нужно проанализировать, без ведущей ссылки на работающую программу. Как правило, это означает sys.argv[1:]. options - это строка букв опций, которые сценарий хочет распознать, с опциями, которые требуют аргумента, за которым следует двоеточие (':'; т. е. тот же формат, что и в Unix getopt()).