2014-01-14 2 views
0

По какой-то причине, когда я передаю опцию с использованием длинной формы, функция getopt не распознает ее должным образом. Есть идеи? Я прочитал здесь документацию http://docs.python.org/2/library/getopt.html, и, похоже, он не должен делать то, что он делает.Почему не работает getopt на python 2.7.5 mac os x

Я запускаю python 2.7.5 на mac os x для записи.

[[email protected]:~] python Script.py test --condition=foo --output-file abc.def 
['test', '--condition=foo', '--output-file', 'abc.def'] 
[] 
<type 'list'> 

def main(argv): 

    try: 
     optlist, args = getopt.getopt(argv[1:], '', ['condition=', 'output-file=', 'testing']) 
    except getopt.GetoptError, msg: 
     logging.warning(msg) 
     return 1 

    print args 
    print optlist 
    print type(optlist) 

я должен получать следующее, как указано в документации:

optlist [('--condition', 'Foo'), ('' --testing , ''), ('--output-файл', 'abc.def')]

+0

Отсутствует импорт? – tintin

+0

Нет. Я действительно импортировал getopt наверху. – jmtoung

+1

Есть ли причина, по которой вы используете 'getopt'? Как говорится в [docs] (http://docs.python.org/2.7/library/getopt.html), вверху в большой ячейке: «Модуль getopt является парсером для параметров командной строки, API которых разработан чтобы быть знакомым пользователям функции C getopt().Пользователи, не знакомые с функцией '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'или '', библиотека/argparse.html # module-argparse). «Вы, очевидно, не эксперт' getopt', так зачем его использовать? – abarnert

ответ

1

докумен tation не говорят, что вы должны это получить. На самом деле, это явно говорит, что вы не должны:

Примечание: В отличие от GNU getopt(), после того, как не-аргумента опции, все дальнейшие аргументы рассматриваются также не варианты. Это похоже на то, как работают не-GNU Unix-системы.

И если вы посмотрите на примеры, аргументы, не вариант приходят после опции в командной строке. Если вы сделаете это, это дает вам то, что вы надеялись:

$ python Script.py --condition=foo --output-file abc.def test 
['test'] 
[('--condition', 'foo'), ('--output-file', 'abc.def')] 
<type 'list'> 

Но если вы делаете что-то другое из примеров, вы получите разные результаты из примеров. И результаты, которые вы получаете, соответствуют тем, что, как говорят ваши документы.

Но если вы не понимаете, зачем класть test после того, как параметры отличны от того, чтобы положить его перед настройками, вы не должны использовать getopt. Как the docs говорят в большой коробке на самом верху:

Примечание: Модуль getopt является синтаксический анализатор для параметров командной строки, чьи API предназначен быть знакомы пользователям функции C getopt(). Пользователи, которые не знакомы с функцией C getopt() или кто хотел бы написать меньше кода и получить более эффективные справки и сообщения об ошибках, следует рассмотреть возможность использования модуля argparse.

Если вы действительно хотите узнать getopt, тогда прочитайте the POSIX definition. Это то, что Python пытается подражать. Он добавляет длинные аргументы GNU-style--, но это не значит, что он включает в себя все расширения GNU.

+0

благодарит за вашу помощь! – jmtoung

Смежные вопросы