Почему getopt не работает, если sys.argv передан полностью? - PullRequest
5 голосов
/ 09 октября 2009

Если я использую это с getopt:

import getopt
import sys

opts,args = getopt.getopt(sys.argv,"a:bc")
print opts
print args

opts будет пустым. Кортежи не будут созданы. Однако, если я буду использовать sys.argv[1:], все будет работать, как ожидалось. Я не понимаю, почему это так. Кто-нибудь хочет объяснить?

Ответы [ 2 ]

13 голосов
/ 09 октября 2009

Первый элемент sys.argv (sys.argv[0]) - это имя выполняемого в данный момент сценария. Поскольку это имя сценария (вероятно) не является допустимым аргументом (и, вероятно, в любом случае не начинается с - или --), getopt не распознает его как аргумент. Из-за особенностей работы getopt, когда он видит что-то, что не является флагом командной строки (то, что не начинается с - или --), он останавливает обработку параметров командной строки (и помещает остальные аргументы в args), поскольку предполагается, что остальные аргументы являются элементами, которые будут обрабатываться программой (например, имена файлов или другие «обязательные» аргументы).

6 голосов
/ 09 октября 2009

Это по замыслу. Напомним, что sys.argv [0] - это имя запущенной программы, а getopt не хочет его.

Из документов:

Анализирует параметры командной строки и список параметров. аргументы аргумент список для анализа без ведущего ссылка на запущенную программу. Как правило, это означает sys.argv [1:]. options - это строка параметра письма, которые скрипт хочет признать, с вариантами, которые требуют аргумент, за которым следует двоеточие (':'; то есть в том же формате, что и Unix getopt () использует).

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

...