Почему 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()).

http://docs.python.org/library/getopt.html

Другие вопросы по тегам